54 lines
1.7 KiB
Java
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));
|
|
}
|
|
|
|
}
|