根据以下代码:static int gtpu_handle_echo_request(gtpu_main_t *gtm, vlib_buffer_t *buffer,gtpu_pkt_info_t *p_gtpu_info,u32 *next) { gtpu_header_t *gtpu = 0; GTPU_ULOG_DBG("gtpu handle echo request"); gtpu = vlib_buffer_get_current(buffer); GTPU_ULOG_DBG("sizeof(gtpu) = %d",sizeof(gtpu)); gtpu->type = GTPU_ECHO_RESPONSE; gtpu->length = clib_host_to_net_u16(6); u8 *ptgptuResponse = (u8 *)buffer; *(ptgptuResponse + 12) = 0x0e; *(ptgptuResponse + 13) = 0x00; *next = gtpu_DECAP_NEXT_DROP; gtpu_decap_swap_gtpu_ip46_src_dst_address(gtm, buffer, p_gtpu_info, next); return GTPU_SUCCESS; },将gtpu报文的第13和14个字节赋值0x0e和0x00这种写法对吗?
时间: 2023-09-02 14:15:03 浏览: 255
根据代码中的写法,将gtpu报文的第13和14个字节赋值0x0e和0x00是不对的。因为在这个函数中,u8 *ptgptuResponse = (u8 *)buffer; 这一行将buffer的地址强制转换为了u8类型的指针,而在接下来的两行代码中,*(ptgptuResponse + 12)和*(ptgptuResponse + 13)分别表示ptgptuResponse指针指向的地址加上12和13个字节后的值,也就是buffer中13和14个字节的值被修改。但是这样的写法是不正确的,因为gtpu结构体中的type和length字段应该是16位的,而不是8位的。所以正确的写法应该是使用16位类型的指针来进行操作,比如:uint16_t *ptgptuResponse = (uint16_t *)(buffer + 12); *ptgptuResponse = clib_host_to_net_u16(0x0e00);
相关问题
vpp插件gtpu中,gtpu处理 Echo Request消息这个函数怎么写(gtpu_handle_echo_request)?
在VPP插件GTPU中,处理Echo Request消息的函数是gtpu_echo_request。该函数的定义如下:
```
static_always_inline void
gtpu_echo_request (vlib_main_t * vm, vlib_node_runtime_t * node,
gtpu_header_t * gtpu, u32 sw_if_index0)
{
vnet_main_t *vnm = vnet_get_main ();
vnet_sw_interface_t *si = vnet_get_sw_interface (vnm, sw_if_index0);
/* Set MTU of the tunnel interface. This is an estimate since we do not
know how many labels the packet will have, but it is better than nothing. */
gtpu4_tunnel_t *t = gtpu4_tunnel_from_gtpu_header (gtpu);
u32 mtu =
si->mtu_bytes - sizeof (ip4_header_t) - sizeof (udp_header_t) -
sizeof (gtpu_header_t);
t->mtu = clib_min (t->mtu, mtu);
/* Just swap IP src/dst and send it back */
ip4_header_t *ip4 = &t->ip4;
ip_csum_t sum0 = ip4->checksum;
ip4->checksum = 0;
ip4->src_address.as_u32 = ip4->dst_address.as_u32;
ip4->dst_address.as_u32 = gtpu->ip4.src_address.as_u32;
ip4->checksum = ip4_header_checksum (ip4);
udp_header_t *udp = &t->udp;
udp->src_port = udp->dst_port;
udp->dst_port = clib_host_to_net_u16 (UDP_DST_PORT_GTPU);
gtpu->flags = GTPU_ECHO_RSP;
vlib_buffer_t *b = vlib_buffer_from_rte_mbuf (gtpu->buffer);
vlib_buffer_advance (b, -(word) sizeof (ip4_header_t));
b->current_data -= sizeof (ip4_header_t);
b->current_length += sizeof (ip4_header_t);
b->total_length_not_including_first_buffer += sizeof (ip4_header_t);
sum0 = ip_csum_update (sum0, 0, 0, ip4->src_address.as_u32);
sum0 = ip_csum_update (sum0, 0, 0, ip4->dst_address.as_u32);
udp->length = clib_host_to_net_u16 (b->current_length);
sum0 = ip_csum_update (sum0, 0, 0, udp->length);
gtpu->length = clib_host_to_net_u16 (b->current_length - sizeof (*ip4) -
sizeof (*udp));
sum0 = ip_csum_update (sum0, 0, 0, gtpu->length);
gtpu->checksum = ~ip_csum_fold (sum0);
vlib_buffer_enqueue_to_next (vm, node, &b, 1, /* next_index */ 1);
}
```
这个函数的作用是将Echo Request消息的源地址和目的地址进行交换,然后将其发送回去,以此来测试是否可以进行双向通信。同时,它还会设置隧道接口的MTU,以预估传输时所需的最大传输单元。
根据gtpu头的报文格式,将gtpu报文的第13和14个字节赋值0x0e和0x00应该怎么写代码?能将整两个值放在gtpu头里面吗?
要将gtpu报文的第13和14个字节赋值0x0e和0x00,可以使用如下代码:
```c
unsigned char gtpu_header[8];
gtpu_header[12] = 0x0e;
gtpu_header[13] = 0x00;
```
这段代码将gtpu头的第13个字节赋值为0x0e,第14个字节赋值为0x00,但是这只是gtpu头的前两个字节,还需要将其余的6个字节也设置好。
另外,整个gtpu头是12个字节,不包括报文负载,因此无法将整两个值放在gtpu头里面。
阅读全文