文章目录

  • 1 以太网输入输出处理的实现
    • 1.1 实现原理
    • 1.2 代码实现

1 以太网输入输出处理的实现

1.1 实现原理

先看下数据包的传递过程:


以太网数据包格式(RFC894):

上面有误,正确的包格式如下:

字节对齐的特殊处理:

大小端转换:


1.2 代码实现

代码结构如下:

xnet_tiny.h中添加以太网包头相关的定义:

#pragma pack(1)#define XNET_MAC_ADDR_SIZE              6           // MAC地址长度/*** 以太网数据帧格式:RFC894*/
typedef struct _xether_hdr_t {uint8_t dest[XNET_MAC_ADDR_SIZE];           // 目标mac地址uint8_t src[XNET_MAC_ADDR_SIZE];            // 源mac地址uint16_t protocol;                          // 协议/长度
}xether_hdr_t;#pragma pack()typedef enum _xnet_protocol_t {XNET_PROTOCOL_ARP = 0x0806,     // ARP协议XNET_PROTOCOL_IP = 0x0800,      // IP协议
}xnet_protocol_t;

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();
}

以太网输入输出处理的实现相关推荐

  1. 内网直播局域网直播校园直播播控系统如何建设

    目录 第1章 项目概况 1.1需求背景 1.2 建设的必要性 1.3 项目建设具备的基础条件 1.4 建设内容 第2章系统介绍 2.1 NMB01校园媒体播控系统 2.2 NMP01视频资源平台 2. ...

  2. 国产化直播系统建设方案

    国产化直播系统建设方案​ 目录 前言... 2 一.      建设内容... 4 二.      建设方案... 5 2.1 NMB01媒体播控系统... 6 2.2 NMP01视频资源平台... ...

  3. matlab怎么加采样开关,开关量采集模块怎么使用?

    简介:关于开关量采集模块怎么使用?的相关装修疑问,相信很多朋友对此并不是非常清楚,为了帮助大家更好的了解相关装修知识要点,小编特此为大家整理出如下讲解内容,希望下面的装修内容对大家有所帮助! 如果有更 ...

  4. 网络分流器|网络分流器大数据采集方案

    网络分流器|戎腾网络分流器作用于网络安全领域,作为网络监控前端的重要基础设备! 网络分流器|互联网数据是大数据分析最为重要的数据来源.通过对大量互联网数据进行采集分析分析可以获得很多宏观和微观的有价值 ...

  5. 你使用的网线是哪种?旭东泰细说CAT5E网线和CAT6非屏蔽网线的不同

    网线是一种利用双绞线传输数据的技术,它是一种简单直观.低成本.高兼容性的网络传输方式,可以传输以太网信号.网线有不同的类别,根据不同的标准和性能,可以分为CAT1.CAT2.CAT3.CAT4.CAT ...

  6. 以太网实习_一位工科男在拿到华为实习生offer后的面经干货

    某211学校,机械学院研究生.本文引用地址:http://www.eepw.com.cn/article/201709/364243.htm 不得不说一下,华为的员工们真的是认真做事,因为怕我们担心下 ...

  7. 以太网口差分电平_以太网接口学习笔记

    英文:Ethernet 中文:以太网 标准号:IEEE802.3/802.3u/802.3z/802.3ab/802.3ae 标准制定与维护:IEEE 国际电气和电子工程师协会 网址:www.ieee ...

  8. 【以太网硬件一】802.3xx标准怎么这么多?它们有什么关系?

    一.802.3标准是什么? 802.3标准的全称为:以"载波侦听多路复用/冲突检测"(CSMA/CD,Carrier Sense Multiple Access/Collision ...

  9. MTK_android11_以太网(内网)和WIFI(外网)共存

    一.思路 所谓共存就是让两个网络同时使用,如果想让哪个网络作为外网,则该网络优先级要高于内网的网络,即可达到外网用来上网的需求,那么要想共存,就必须到从低优先级网络切换到优先级高的网络时,不要做断开操 ...

最新文章

  1. 我用YOLOX露了一手,记录一下模型部署、优化及训练的实现全过程
  2. 有道云笔记Windows桌面版v6.5.0.0去左下角广告方法
  3. easyExcel 读取日期为数字的解决方案
  4. SQL基础【十三、通配符】
  5. 选择最好用的PyCharm IDE
  6. 生活大爆炸版石头剪刀布
  7. Tortoise SVN 版本控制常用操作知识
  8. java request获取文件_request获取路径方式
  9. Serverless在SaaS领域的最佳实践
  10. Python os.system(command),这样执行的command命令,和主程序是异步的吗?
  11. 寡头时代——新的希望还是?
  12. sql语句日期格式转换
  13. 计算机主机接口,计算机主机背面有哪些接口
  14. 【Request】全面总结并理解request
  15. PCAN二次开发,用MFC发送一帧CAN消息
  16. 利用遗传算法GA和粒子群算法PSO优化算法,将BP神经网络训练集的MSE作为适应度函数
  17. July:海量数据处理
  18. 【Android】 使用AndServer框架在手机上搭建服务器
  19. 某商场TD-LTE室内覆盖规划
  20. 第二章:软件测试的方法

热门文章

  1. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第7章-二阶时滞多智能体系统分组一致性
  2. matlab与quartus的联合数据交换(NCO与文件数据的混频处理)
  3. python基础1(来自廖雪峰的官方网站)
  4. usb_get_device_descriptor()
  5. 【S操作】综合利用腾讯文档、OneDrive、印象笔记evernote、有道云笔记等各种云工具,轻松实现数据云存储及多重备份...
  6. 大数据玩家们对2013年趋势的预测
  7. 微信公众平台向特定用户推送消息
  8. linux 查看文件夹大小 du命令
  9. git 查看某个文件的历史记录
  10. 如何使用jlink从flash中读取数据保存为bin文件到本地