rip-java/src/main/java/cn/x47/handle/RIPPacketEncoder.java
2024-11-30 14:16:17 +08:00

54 lines
1.7 KiB
Java

package cn.x47.handle;
import cn.x47.model.RIPEntry;
import cn.x47.model.RIPPacket;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageEncoder;
import java.net.InetSocketAddress;
import java.util.List;
/**
* 编码器
*/
public class RIPPacketEncoder extends MessageToMessageEncoder<RIPPacket> {
@Override
protected void encode(ChannelHandlerContext ctx, RIPPacket msg, List<Object> out) throws Exception {
ByteBuf buf = ctx.alloc().buffer();
// 编码命令和版本
buf.writeByte(msg.getCommand());
buf.writeByte(msg.getVersion());
buf.writeShort(msg.getUnused()); // unused 字段
// 编码路由条目
for (RIPEntry entry : msg.getEntries()) {
buf.writeShort(entry.getAddressFamily() & 0xFFFF);
if (msg.getVersion() == 2) {
buf.writeShort(entry.getRouteTag() & 0xFFFF);
}
buf.writeBytes(entry.getIpAddress().getAddress());
if (msg.getVersion() == 2) {
buf.writeBytes(entry.getSubnetMask().getAddress());
buf.writeBytes(entry.getNextHop().getAddress());
}
buf.writeInt((int) entry.getMetric() & 0xFFFFFFFF);
}
// 根据版本选择目标地址
InetSocketAddress recipient;
if (msg.getVersion() == 1) {
recipient = new InetSocketAddress("255.255.255.255", 520);
} else {
recipient = new InetSocketAddress("224.0.0.9", 520);
}
out.add(new DatagramPacket(buf, recipient));
}
}