`

以太网内核与MAC相关的函数

阅读更多
#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中声明预定义
分享到:
评论

相关推荐

    基于macb改的linux系统4.14内核 MAC层网卡直连(省略硬件phy及驱动)

    在Linux内核中,macb是针对以太网控制器的一个驱动框架,它提供了一个抽象层,允许不同的硬件接口在MAC层上进行操作。在基于macb的系统中,我们可以通过修改驱动代码,让网卡直接在MAC层与其他设备进行通信,而不...

    嵌入式系统的以太网接口设计及linux内核网络设备驱动宣贯.pdf

    本文主要探讨了以太网在嵌入式系统中的应用以及Linux内核网络设备驱动的相关知识,旨在理解和实现嵌入式设备的网络接口设计。 以太网是目前局域网中最广泛使用的通信协议标准,基于CSMA/CD(载波监听多路访问/冲突...

    嵌入式系统的以太网接口设计及linux内核网络设备驱动可用.pdf

    嵌入式处理器扩展以太网接口时,MAC层控制器通过MII或RMII接口与PHY连接。例如,DM9000A是一款高性能的以太网接口芯片,它集成了10/100M物理层接口,内部16K字节SRAM用于接收和发送FIFO缓存,并支持8/16bit两种工作...

    嵌入式系统的以太网接口设计及linux内核网络设备驱动汇编.pdf

    嵌入式系统的以太网接口设计及 Linux 内核网络设备驱动汇编 以太网概述 以太网是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问(CSMA/CD)...

    嵌入式系统的以太网接口设计及linux内核网络设备驱动[归纳].pdf

    "嵌入式系统的以太网接口设计及Linux内核网络设备驱动" 以太网概述: 以太网(Ethernet)是当今局域网采用的最通用的通信协议标准。在以太网中,所有计算机被连接在一条电缆上,采用带冲突检测的载波侦听多路访问...

    DSP芯片 F28335的以太网调试程序

    在压缩包内的文件"**F28335wang**"可能包含了与F28335 DSP以太网相关的源代码、配置文件、头文件或文档,用于帮助用户理解和实现以太网通信功能。这些文件可能包括驱动程序、TCP/IP协议栈的实现、示例代码以及调试...

    嵌入式系统的以太网接口设计及linux内核网络设备驱动.pdf

    以太网规范主要涵盖了OSI模型的物理层(PHY)和数据链路层(MAC)。物理层定义了传输媒介(如双绞线或同轴电缆)和信号标准,而MAC层则负责帧的封装、解封装、发送和接收。 【嵌入式处理器上的以太网接口扩展】 在...

    STM32F407开发板-以太网-TCP客户端网络通信

    STM32F407开发板是基于ARM Cortex-M4内核的微控制器,具有高性能、低功耗的特点,广泛应用于嵌入式系统设计。在本项目中,我们将重点探讨如何利用STM32F407开发板实现以太网TCP客户端的网络通信功能。 以太网是...

    atmel samv71以太网功能开发测试代码

    在SAMV71上,这个内核使得设备能够高效地处理以太网协议栈和相关的数据传输任务。 以太网功能是现代微控制器中常见的通信接口,它允许设备通过局域网与其他设备交互。在SAMV71中,以太网功能通常由集成的MAC(Media...

    最新嵌入式系统的以太网接口设计及linux内核网络设备驱动.doc

    ### 最新嵌入式系统的以太网接口设计及Linux内核网络设备驱动 #### 一、以太网概述 以太网(Ethernet)是目前应用最为广泛的局域网(LAN)通信协议标准之一。它主要采用了带冲突检测的载波侦听多路访问(Carrier ...

    stm32之以太网

    STM32是一款基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统设计。在本文中,我们将探讨STM32中的以太网功能,包括如何实现TCP和UDP通信以及HTTP服务。 首先,以太网是STM32实现网络通信的基础,它允许设备...

    STM32以太网例程

    STM32F107是意法半导体(STMicroelectronics)生产的基于ARM Cortex-M3内核的微控制器,广泛应用于工业控制、物联网设备等领域。在STM32F107中,集成的以太网MAC模块使得设备可以直接连接到局域网或互联网,实现网络...

    用于 XMOS微控制器 的 10/100 MII 以太网 MAC_XC_代码_相关文件_下载

    XCORE.com 以太网软件组件 ...RX 和 TX 被定义为在各自的逻辑内核上运行的函数。单个端口的核心使用为 5 个逻辑核心(对于较低带宽的传输应用,可减少到 4 个)。 更多详情、使用方法,请下载后阅读README.md文件

    Linux内核bridge浅析.doc

    Linux内核bridge浅析是Linux操作系统中的一种网桥模型,用于连接和桥接多个以太网接口设备。下面是对Linux内核bridge浅析的详细说明: 网桥模型 Linux内核通过一个虚拟的网桥设备来实现桥接的,这个设备可以绑定...

    STM32以太网TCP服务器收发数据实验

    要使用这个功能,我们需要配置相关的寄存器,如MAC地址、PHY状态监测等,并确保与外部PHY芯片(如RTL8201N)的连接正确。 其次,TCP/IP协议栈的实现至关重要。在STM32上,我们通常使用第三方库如lwIP(轻量级互联网...

    添加内核网络栈协议 介于二层与三层

    3. **源文件**:描述中提到的“一些重要的源文件”可能包含了新协议的具体实现,如协议头解析、数据封装和解封装函数,以及与硬件交互的驱动程序代码。这些源文件需要被正确地链接到内核网络子系统的相应位置。 在...

    基于WinPcap的以太网抓包 分析

    **基于WinPcap的以太网抓包与分析** 在计算机网络中,数据包抓取是一种重要的诊断和学习工具,它允许我们查看网络上的实际通信情况。WinPcap(Windows Packet Capture)是Windows操作系统下的一个开源库,专门用于...

    STM32F407以太网UDP主机发送接收程序

    STM32F407是一款高性能的ARM Cortex-M4内核处理器,具有浮点单元,广泛应用于工业控制、物联网设备和消费电子产品等领域。在这款MCU上实现以太网通信,特别是UDP协议,对于构建网络连接的智能硬件至关重要。 以太网...

    STM32开发板uIP1.0+以太网例程

    本教程聚焦于STM32开发板上使用uIP 1.0实现以太网通信的实例,旨在帮助开发者理解如何将STM32与网络通信功能结合。 uIP(Micro IP)是一个轻量级的TCP/IP协议栈,适用于资源有限的嵌入式系统,如STM32这类微控制器...

    stm32w550以太网通信

    1. 配置MAC地址:每个连接到以太网的设备都需要一个唯一的物理地址,即MAC地址。在STM32W550上,这通常通过编程设置在内部寄存器中。 2. 初始化W5500:在开始通信前,需要配置W5500的工作模式、波特率、IP地址、...

Global site tag (gtag.js) - Google Analytics