网络子系统45_ip协议tos处理

//ip报头tos字段,一个字节
//	二进制位:[0 1 2] [3] [4] [5] [6] [7]
//		1.[0 1 2] 表示优先级:
//			000 路由
//			001 优先级
//			010 立即
//			011 火速
//			100	火速覆盖
//			101 紧急
//			110 互联网控制
//			111 网络控制
//		2.[3] 表示时延
//			0 普通
//			1 最小
//		3.[4] 吞吐量
//			0 普通
//			1 最大
//		4.[5] 可靠性
//			0 普通
//			1.最大
//		5.[6] 开销
//			0 普通
//			1 最小
//		6.[7] 保留,恒为0

//由ip报头的tos字段,计算skb的优先级,用于在规则队列中选择优先级队列
1.1 static inline char rt_tos2priority(u8 tos)
{
	return ip_tos2prio[IPTOS_TOS(tos)>>1];
}

//获取tos的[3,4,5,6]比特位,右移一位,转换为0~15范围的数
1.2 
#define IPTOS_TOS_MASK		0x1E
#define IPTOS_TOS(tos)		((tos)&IPTOS_TOS_MASK)

//
1.3 __u8 ip_tos2prio[16] = {
	TC_PRIO_BESTEFFORT,
	ECN_OR_COST(FILLER),
	TC_PRIO_BESTEFFORT,
	ECN_OR_COST(BESTEFFORT),
	TC_PRIO_BULK,
	ECN_OR_COST(BULK),
	TC_PRIO_BULK,
	ECN_OR_COST(BULK),
	TC_PRIO_INTERACTIVE,
	ECN_OR_COST(INTERACTIVE),
	TC_PRIO_INTERACTIVE,
	ECN_OR_COST(INTERACTIVE),
	TC_PRIO_INTERACTIVE_BULK,
	ECN_OR_COST(INTERACTIVE_BULK),
	TC_PRIO_INTERACTIVE_BULK,
	ECN_OR_COST(INTERACTIVE_BULK)
};


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编写 IP 协议解析代码需要以下步骤: 1. 定义IP数据包结构体: ``` typedef struct { uint8_t version_ihl; uint8_t tos; uint16_t length; uint16_t id; uint16_t flags_offset; uint8_t ttl; uint8_t protocol; uint16_t checksum; uint8_t src_addr[4]; uint8_t dst_addr[4]; } ip_header_t; ``` 2. 在 Verilog 中定义 IP 协议解析模块,该模块接收一个 32 位的数据包作为输入,然后解析出其中的 IP 部信息: ``` module ip_protocol_parser ( input wire [31:0] packet_in, output wire [3:0] protocol_out, output wire [31:0] src_ip_out, output wire [31:0] dst_ip_out ); wire [7:0] version_ihl; wire [7:0] protocol; wire [15:0] ip_length; wire [15:0] ip_id; wire [15:0] flags_offset; wire [7:0] ttl; wire [15:0] checksum; wire [31:0] src_ip; wire [31:0] dst_ip; ip_header_t header; assign version_ihl = packet_in[31:24]; assign protocol = packet_in[23:16]; assign ip_length = packet_in[15:0]; assign ip_id = packet_in[47:32]; assign flags_offset = packet_in[63:48]; assign ttl = packet_in[71:64]; assign protocol = packet_in[79:72]; assign checksum = packet_in[95:80]; assign src_ip = packet_in[127:96]; assign dst_ip = packet_in[159:128]; assign header.version_ihl = version_ihl; assign header.tos = packet_in[23:16]; assign header.length = ip_length; assign header.id = ip_id; assign header.flags_offset = flags_offset; assign header.ttl = ttl; assign header.protocol = protocol; assign header.checksum = checksum; assign header.src_addr[0] = src_ip[31:24]; assign header.src_addr[1] = src_ip[23:16]; assign header.src_addr[2] = src_ip[15:8]; assign header.src_addr[3] = src_ip[7:0]; assign header.dst_addr[0] = dst_ip[31:24]; assign header.dst_addr[1] = dst_ip[23:16]; assign header.dst_addr[2] = dst_ip[15:8]; assign header.dst_addr[3] = dst_ip[7:0]; assign protocol_out = header.protocol; assign src_ip_out = src_ip; assign dst_ip_out = dst_ip; endmodule ``` 3. 在 Verilog 中编写测试模块,生成一个随机的 IP 数据包,并将其传递给 IP 协议解析模块进行解析。测试模块可以使用 Verilog 的 $display 函数打印出解析结果: ``` module ip_protocol_parser_test; wire [31:0] packet_in; wire [3:0] protocol_out; wire [31:0] src_ip_out; wire [31:0] dst_ip_out; ip_protocol_parser parser ( .packet_in(packet_in), .protocol_out(protocol_out), .src_ip_out(src_ip_out), .dst_ip_out(dst_ip_out) ); initial begin $monitor("Protocol: %b", protocol_out); $monitor("Source IP: %h", src_ip_out); $monitor("Destination IP: %h", dst_ip_out); repeat (10) begin packet_in = $random; #1; end end endmodule ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值