#define ETH_ALEN 6 /* Octets in one ethernet addr */
#define ETH_HLEN 14 /* Total octets in header. */
#define ETH_ZLEN 60 /* Min. octets in frame sans FCS */
#define ETH_DATA_LEN 1500 /* Max. octets in payload */
#define ETH_FRAME_LEN 1514 /* Max. octets in frame sans FCS */
#define ETH_FCS_LEN 4 /* Octets in the FCS
struct ethhdr
{
unsigned char h_dest[ETH_ALEN]; //目的MAC
unsigned char h_source[ETH_ALEN]; //源MAC
__be16 h_proto; //包类型ID
} __attribute__((packed)); //数据帧对齐
h_proto的取值有:
#define ETH_P_LOOP 0x0060 /* Ethernet Loopback packet */
#define ETH_P_PUP 0x0200 /* Xerox PUP packet */
#define ETH_P_PUPAT 0x0201 /* Xerox PUP Addr Trans packet */
#define ETH_P_IP 0x0800 /* Internet Protocol packet */
#define ETH_P_X25 0x0805 /* CCITT X.25 */
#define ETH_P_ARP 0x0806 /* Address Resolution packet */
#define ETH_P_BPQ 0x08FF
#define ETH_P_IEEEPUP 0x0a00 /* Xerox IEEE802.3 PUP packet */
#define ETH_P_IEEEPUPAT 0x0a01
#define ETH_P_DEC 0x6000 /* DEC Assigned proto */
#define ETH_P_DNA_DL 0x6001 /* DEC DNA Dump/Load */
#define ETH_P_DNA_RC 0x6002 /* DEC DNA Remote Console */
#define ETH_P_DNA_RT 0x6003 /* DEC DNA Routing */
#define ETH_P_LAT 0x6004 /* DEC LAT */
#define ETH_P_DIAG 0x6005 /* DEC Diagnostics */
#define ETH_P_CUST 0x6006 /* DEC Customer use */
#define ETH_P_SCA 0x6007 /* DEC Systems Comms Arch */
#define ETH_P_TEB 0x6558 /* Trans Ether Bridging */
#define ETH_P_RARP 0x8035 /* Reverse Addr Res packet */
#define ETH_P_ATALK 0x809B /* Appletalk DDP */
#define ETH_P_AARP 0x80F3 /* Appletalk AARP */
#define ETH_P_8021Q 0x8100 /* 802.1Q VLAN Extended Header */
#define ETH_P_IPX 0x8137 /* IPX over DIX */
#define ETH_P_IPV6 0x86DD /* IPv6 over bluebook */
#define ETH_P_PAUSE 0x8808 /* IEEE Pause frames. See 802.3 31B */
#define ETH_P_SLOW 0x8809 /* Slow Protocol. See 802.3ad 43B */
#define ETH_P_WCCP 0x883E /* Web-cache coordination protocol
#define ETH_P_PPP_DISC 0x8863 /* PPPoE discovery messages */
#define ETH_P_PPP_SES 0x8864 /* PPPoE session messages */
#define ETH_P_MPLS_UC 0x8847 /* MPLS Unicast traffic */
#define ETH_P_MPLS_MC 0x8848 /* MPLS Multicast traffic */
#define ETH_P_ATMMPOA 0x884c /* MultiProtocol Over ATM */
#define ETH_P_ATMFATE 0x8884 */
#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
#define ETH_P_AOE 0x88A2 /* ATA over Ethernet */
#define ETH_P_TIPC 0x88CA /* TIPC */
#define ETH_P_FCOE 0x8906 /* Fibre Channel over Ethernet */
#define ETH_P_EDSA 0xDADA
//此函数用于获取以太网帧头
//struct ethhdr* eth = eth_hdr(skb);
static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
{
return (struct ethhdr *)skb_mac_header(skb);
}
//复制MAC地址,并返回地址长度
int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr)
{
const struct ethhdr *eth = eth_hdr(skb);
memcpy(haddr, eth->h_source, ETH_ALEN); //复制源MAC
return ETH_ALEN;
}
//格式化以太网帧头
static size_t _format_mac_addr(char *buf, int buflen,
const unsigned char *addr, int len)
{
int i;
char *cp = buf;
for (i = 0; i < len; i++)
{
cp += scnprintf(cp, buflen - (cp - buf), "%02x", addr[i]);
if (i == len - 1)
break;
cp += strlcpy(cp, ":", buflen - (cp - buf));
}
return cp - buf;
}
//格式化的最终调用形式
char *print_mac(char *buf, const unsigned char *addr)
{
_format_mac_addr(buf, MAC_BUF_SIZE, addr, ETH_ALEN);
return buf;
}
//重新组建MAC帧头
int eth_rebuild_header(struct sk_buff *skb)
{
struct ethhdr *eth = (struct ethhdr *)skb->data;
struct net_device *dev = skb->dev;
switch (eth->h_proto)
{
#ifdef CONFIG_INET
case htons(ETH_P_IP):
return arp_find(eth->h_dest, skb);
#endif
default:
printk(KERN_DEBUG
"%s: unable to resolve type %X addresses.\n",
dev->name, (int)eth->h_proto);
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
break;
}
return 0;
}
* eth_type_trans - determine the packet's protocol ID.
* @skb: received socket data
* @dev: receiving network device
__be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
//改写MAC协议ID如:
skb->protocol = eth_type_trans(skb, dev);
//以上均在linux/if_ether.h中声明预定义
分享到:
相关推荐
在Linux内核中,macb是针对以太网控制器的一个驱动框架,它提供了一个抽象层,允许不同的硬件接口在MAC层上进行操作。在基于macb的系统中,我们可以通过修改驱动代码,让网卡直接在MAC层与其他设备进行通信,而不...
本文主要探讨了以太网在嵌入式系统中的应用以及Linux内核网络设备驱动的相关知识,旨在理解和实现嵌入式设备的网络接口设计。 以太网是目前局域网中最广泛使用的通信协议标准,基于CSMA/CD(载波监听多路访问/冲突...
嵌入式处理器扩展以太网接口时,MAC层控制器通过MII或RMII接口与PHY连接。例如,DM9000A是一款高性能的以太网接口芯片,它集成了10/100M物理层接口,内部16K字节SRAM用于接收和发送FIFO缓存,并支持8/16bit两种工作...
嵌入式系统的以太网接口设计及 Linux 内核网络设备驱动汇编 以太网概述 以太网是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问(CSMA/CD)...
"嵌入式系统的以太网接口设计及Linux内核网络设备驱动" 以太网概述: 以太网(Ethernet)是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问...
在压缩包内的文件"**F28335wang**"可能包含了与F28335 DSP以太网相关的源代码、配置文件、头文件或文档,用于帮助用户理解和实现以太网通信功能。这些文件可能包括驱动程序、TCP/IP协议栈的实现、示例代码以及调试...
以太网规范主要涵盖了OSI模型的物理层(PHY)和数据链路层(MAC)。物理层定义了传输媒介(如双绞线或同轴电缆)和信号标准,而MAC层则负责帧的封装、解封装、发送和接收。 【嵌入式处理器上的以太网接口扩展】 在...
STM32F407开发板是基于ARM Cortex-M4内核的微控制器,具有高性能、低功耗的特点,广泛应用于嵌入式系统设计。在本项目中,我们将重点探讨如何利用STM32F407开发板实现以太网TCP客户端的网络通信功能。 以太网是...
在SAMV71上,这个内核使得设备能够高效地处理以太网协议栈和相关的数据传输任务。 以太网功能是现代微控制器中常见的通信接口,它允许设备通过局域网与其他设备交互。在SAMV71中,以太网功能通常由集成的MAC(Media...
### 最新嵌入式系统的以太网接口设计及Linux内核网络设备驱动 #### 一、以太网概述 以太网(Ethernet)是目前应用最为广泛的局域网(LAN)通信协议标准之一。它主要采用了带冲突检测的载波侦听多路访问(Carrier ...
STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计。在本文中,我们将探讨STM32中的以太网功能,包括如何实现TCP和UDP通信以及HTTP服务。 首先,以太网是STM32实现网络通信的基础,它允许设备...
STM32F107是意法半导体(STMicroelectronics)生产的基于ARM Cortex-M3内核的微控制器,广泛应用于工业控制、物联网设备等领域。在STM32F107中,集成的以太网MAC模块使得设备可以直接连接到局域网或互联网,实现网络...
XCORE.com 以太网软件组件 ...RX 和 TX 被定义为在各自的逻辑内核上运行的函数。单个端口的核心使用为 5 个逻辑核心(对于较低带宽的传输应用,可减少到 4 个)。 更多详情、使用方法,请下载后阅读README.md文件
Linux内核bridge浅析是Linux操作系统中的一种网桥模型,用于连接和桥接多个以太网接口设备。下面是对Linux内核bridge浅析的详细说明: 网桥模型 Linux内核通过一个虚拟的网桥设备来实现桥接的,这个设备可以绑定...
要使用这个功能,我们需要配置相关的寄存器,如MAC地址、PHY状态监测等,并确保与外部PHY芯片(如RTL8201N)的连接正确。 其次,TCP/IP协议栈的实现至关重要。在STM32上,我们通常使用第三方库如lwIP(轻量级互联网...
3. **源文件**:描述中提到的“一些重要的源文件”可能包含了新协议的具体实现,如协议头解析、数据封装和解封装函数,以及与硬件交互的驱动程序代码。这些源文件需要被正确地链接到内核网络子系统的相应位置。 在...
**基于WinPcap的以太网抓包与分析** 在计算机网络中,数据包抓取是一种重要的诊断和学习工具,它允许我们查看网络上的实际通信情况。WinPcap(Windows Packet Capture)是Windows操作系统下的一个开源库,专门用于...
STM32F407是一款高性能的ARM Cortex-M4内核处理器,具有浮点单元,广泛应用于工业控制、物联网设备和消费电子产品等领域。在这款MCU上实现以太网通信,特别是UDP协议,对于构建网络连接的智能硬件至关重要。 以太网...
本教程聚焦于STM32开发板上使用uIP 1.0实现以太网通信的实例,旨在帮助开发者理解如何将STM32与网络通信功能结合。 uIP(Micro IP)是一个轻量级的TCP/IP协议栈,适用于资源有限的嵌入式系统,如STM32这类微控制器...
1. 配置MAC地址:每个连接到以太网的设备都需要一个唯一的物理地址,即MAC地址。在STM32W550上,这通常通过编程设置在内部寄存器中。 2. 初始化W5500:在开始通信前,需要配置W5500的工作模式、波特率、IP地址、...