日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

IP协议的输出处理

發布時間:2025/4/5 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IP协议的输出处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 IP協議的輸出處理
      • 1.1 原理介紹
      • 1.2 代碼實現

1 IP協議的輸出處理

1.1 原理介紹

IP數據包的封裝:

IP包頭部數據格式(RFC791):

1.2 代碼實現

代碼組織如下:

xnet_tiny.h中添加如下代碼:

#define XNET_VERSION_IPV4 4 // IPV4 #define XNET_IP_DEFAULT_TTL 64 // 缺省的IP包TTL值xnet_err_t xip_out(xnet_protocol_t protocol, xipaddr_t* dest_ip, xnet_packet_t * packet);

xnet_tiny.c中添加如下代碼:

/*** 解析指定的IP地址,如果不在ARP表項中,則發送ARP請求* @param ipaddr 查找的ip地址* @param mac_addr 返回的mac地址存儲區* @return XNET_ERR_OK 查找成功,XNET_ERR_NONE 查找失敗*/ xnet_err_t xarp_resolve(const xipaddr_t * ipaddr, uint8_t ** mac_addr) {if ((arp_entry.state == XARP_ENTRY_OK) && xipaddr_is_equal(ipaddr, &arp_entry.ipaddr)) {*mac_addr = arp_entry.macaddr;return XNET_ERR_OK;}xarp_make_request(ipaddr);return XNET_ERR_NONE; }/*** 將IP數據包通過以太網發送出去* @param dest_ip 目標IP地址* @param packet 待發送IP數據包* @return 發送結果*/ static xnet_err_t ethernet_out (xipaddr_t * dest_ip, xnet_packet_t * packet) {xnet_err_t err;uint8_t * mac_addr;if ((err = xarp_resolve(dest_ip, &mac_addr) == XNET_ERR_OK)) {return ethernet_out_to(XNET_PROTOCOL_IP, mac_addr, packet);}return err; }/*** IP包的輸出* @param protocol 上層協議,ICMP、UDP或TCP* @param dest_ip* @param packet* @return*/ xnet_err_t xip_out(xnet_protocol_t protocol, xipaddr_t* dest_ip, xnet_packet_t * packet) {static uint32_t ip_packet_id = 0;xip_hdr_t * iphdr;add_header(packet, sizeof(xip_hdr_t));iphdr = (xip_hdr_t*)packet->data;iphdr->version = XNET_VERSION_IPV4;iphdr->hdr_len = sizeof(xip_hdr_t) / 4;iphdr->tos = 0;iphdr->total_len = swap_order16(packet->size);iphdr->id = swap_order16(ip_packet_id);iphdr->flags_fragment = 0;iphdr->ttl = XNET_IP_DEFAULT_TTL;iphdr->protocol = protocol;memcpy(iphdr->dest_ip, dest_ip->array, XNET_IPV4_ADDR_SIZE);memcpy(iphdr->src_ip, netif_ipaddr.array, XNET_IPV4_ADDR_SIZE);iphdr->hdr_checksum = 0;iphdr->hdr_checksum = checksum16((uint16_t *)iphdr, sizeof(xip_hdr_t), 0, 1);;ip_packet_id++;return ethernet_out(dest_ip, packet); }

總結

以上是生活随笔為你收集整理的IP协议的输出处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。