iphdr_fill(struct sk_buff *skb, struct iphdr *old_iphdr) { struct iphdr *new_iphdr = NULL; new_iphdr = (struct iphdr *)skb_put(skb, sizeof(struct iphdr)); skb_set_network_header(skb, TPLOGIN_ETH_HDR_LEN); memcpy((unsigned char *)new_iphdr, (unsigned char *)old_iphdr, (old_iphdr->ihl << 2)); new_iphdr->ttl = TPLONGIN_DFT_TTL; new_iphdr->frag_off |= htons( 0x4000 ); memcpy((unsigned char *)&new_iphdr->saddr, (unsigned char *)&old_iphdr->daddr, sizeof(__u32)); memcpy((unsigned char *)&new_iphdr->daddr, (unsigned char *)&old_iphdr->saddr, sizeof(__u32)); return new_iphdr; } 这段代码的功能
时间: 2024-04-25 21:26:44 浏览: 222
Ping的原代码.rar_ping_windows ping_抹0操作C代码
这段代码定义了一个名为iphdr_fill的函数,该函数接受两个参数:skb和old_iphdr。该函数的主要目的是在一个新的sk_buff中填充一个新的IP头部,以便将网络数据包转发到下一个网络节点。
具体来说,该函数首先使用skb_put函数将一个新的IP头部添加到sk_buff中,并使用skb_set_network_header函数将sk_buff的网络头部指针设置为TPLOGIN_ETH_HDR_LEN。然后,该函数将旧的IP头部old_iphdr的内容memcpy到新的IP头部new_iphdr中,并将新的IP头部中的TTL设置为TPLONGIN_DFT_TTL。接着,函数将IP头部中的标记位frag_off设置为0x4000(表示"不分片")。最后,该函数交换新IP头部中的源IP地址和目的IP地址,并返回新的IP头部new_iphdr。
阅读全文