以太网Ethernet解码概述
生活随笔
收集整理的这篇文章主要介绍了
以太网Ethernet解码概述
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
目录
- 1. 申明
- 2. 目的
- 3. 背景知识
- 3.1 Ethernet协议的作用和历史
- 3.2 Ethernet承载IP的例子
- 4. 代码demo
- 5. 专栏知识链接
- 6. 写在最后
1. 申明
本文章属于原创,其中参考的代码及文章在结尾处标明,侵删。
2. 目的
本文是为了解析Ethernet协议及其上层承载的协议所写demo。
3. 背景知识
3.1 Ethernet协议的作用和历史
3.2 Ethernet承载IP的例子
字段含义:
Destination/目的字段:标识目标通信方的MAC地址 (6bytes)
Source/源字段:标识发送端的MAC地址 (6bytes)
Type/类型值:标志上层协议 (2bytes)
MAC地址:
所有设备的MAC地址是全球唯一的.
MAC地址大小为6字节
MAC地址的前半部分被称为"OUI代码"厂商唯一标识符, 后半部分厂商自动分配
4. 代码demo
#include <stdint.h>/* mac 地址长度 */ #define MAC_ADDR_BTYES_LEN 6 /* ethernet头总长度 */ #define MAC_TOTAL_BTYES_LEN 14 /* 上层承载协议类型 */ #define PROTOCOL_UNKNOW 0 #define PROTOCOL_IPV4 1 #define PROTOCOL_IPV6 2 #define PROTOCOL_MPLS 3 #define PROTOCOL_VLAN 4 #define PROTOCOL_PPPOE 5 #define PROTOCOL_8021AD 6typedef struct {uint8_t dest_addr[MAC_ADDR_BTYES_LEN];uint8_t src_addr[MAC_ADDR_BTYES_LEN];uint16_t next_protocol_type; } st_ethernet_hdr;static inline int get_eth_next_protocol(st_ethernet_hdr *dr) {switch (ntohs(dr->next_protocol_type)) {case 0x0800:return PROTOCOL_IPV4;case 0x86dd:return PROTOCOL_IPV6;case 0x8847:case 0x8848:return PROTOCOL_MPLS;case 0x8100:case 0x9100:return PROTOCOL_VLAN;case 0x8864:return PROTOCOL_PPPOE;case 0x88a8:return PROTOCOL_8021AD;default:return PROTOCOL_UNKNOW;}return PROTOCOL_UNKNOW; }/*解码ethernet协议@param1 pdata: 原始数据pdata的指针@param2 len: 原始数据的长度@return int:PROTOCOL_UNKNOW : faildother value : succeed */ int decode_ethernet(uint8_t *pdata, uint8_t len) {if (UNLIKELY(len < MAC_TOTAL_BTYES_LEN)) {return PROTOCOL_UNKNOW;}st_ethernet_hdr *pethernet = (st_ethernet_hdr *)(pdata);return get_eth_next_protocol(pethernet); }划重点: 为了解码Ethernet层,需要传入起始正确的数据和长度,在解码返回值不为PROTOCOL_UNKNOW时,说明解析成功,此时应该在调用函数之后,将指向数据的指针和长度分别偏移MAC_TOTAL_BTYES_LEN,即14bytes,来跳过Ethernet层。
5. 专栏知识链接
1. 协议知识概述
2. H264分辨率解码概述
3. H265分辨率解码概述
6. 写在最后
本文引用了以下文章作者的代码或思路, 并结合了实际项目中的代码整理出的demo,如有问题欢迎指正。https://blog.csdn.net/qq_28110727/article/details/96581196
总结
以上是生活随笔为你收集整理的以太网Ethernet解码概述的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: H264分辨率解码概述
- 下一篇: 项目资源管理