當前位置:
首頁 >
IP协议的输出处理
發布時間:2025/4/5
20
豆豆
文章目錄
- 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); }總結
- 上一篇: 音视频编解码的国际标准
- 下一篇: 特斯拉Semi上市时间,2021年或许要