以太网输入输出处理的实现
生活随笔
收集整理的這篇文章主要介紹了
以太网输入输出处理的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 以太網輸入輸出處理的實現
- 1.1 實現原理
- 1.2 代碼實現
1 以太網輸入輸出處理的實現
1.1 實現原理
先看下數據包的傳遞過程:
以太網數據包格式(RFC894):
上面有誤,正確的包格式如下:
字節對齊的特殊處理:
大小端轉換:
1.2 代碼實現
代碼結構如下:
xnet_tiny.h中添加以太網包頭相關的定義:
xnet_tiny.h添加以太網輸入輸出處理的代碼:
static uint8_t netif_mac[XNET_MAC_ADDR_SIZE]; // mac地址#define swap_order16(v) ((((v) & 0xFF) << 8) | (((v) >> 8) & 0xFF))/*** 以太網初始化* @return 初始化結果*/ static xnet_err_t ethernet_init (void) {xnet_err_t err = xnet_driver_open(netif_mac);if (err < 0) return err;return XNET_ERR_OK; }/*** 發送一個以太網數據幀* @param protocol 上層數據協議,IP或ARP* @param mac_addr 目標網卡的mac地址* @param packet 待發送的數據包* @return 發送結果*/ static xnet_err_t ethernet_out_to(xnet_protocol_t protocol, const uint8_t *mac_addr, xnet_packet_t * packet) {xether_hdr_t* ether_hdr;// 添加頭部add_header(packet, sizeof(xether_hdr_t));ether_hdr = (xether_hdr_t*)packet->data;memcpy(ether_hdr->dest, mac_addr, XNET_MAC_ADDR_SIZE);memcpy(ether_hdr->src, netif_mac, XNET_MAC_ADDR_SIZE);ether_hdr->protocol = swap_order16(protocol);// 數據發送return xnet_driver_send(packet); }/*** 以太網數據幀輸入輸出* @param packet 待處理的包*/ static void ethernet_in (xnet_packet_t * packet) {// 至少要比頭部數據大if (packet->size <= sizeof(xether_hdr_t)) {return;}// 往上分解到各個協議處理xether_hdr_t* hdr = (xether_hdr_t*)packet->data;switch (swap_order16(hdr->protocol)) {case XNET_PROTOCOL_ARP:break;case XNET_PROTOCOL_IP: {break;}} }/*** 查詢網絡接口,看看是否有數據包,有則進行處理*/ static void ethernet_poll (void) {xnet_packet_t * packet;if (xnet_driver_read(&packet) == XNET_ERR_OK) {// 正常情況下,在此打個斷點,全速運行// 然后在對方端ping 192.168.254.2,會停在這里ethernet_in(packet);} }/*** 協議棧的初始化*/ void xnet_init (void) {ethernet_init(); }/*** 輪詢處理數據包,并在協議棧中處理*/ void xnet_poll(void) {ethernet_poll(); }總結
以上是生活随笔為你收集整理的以太网输入输出处理的实现的全部內容,希望文章能夠幫你解決所遇到的問題。