SylixOS 协议栈学习(一)网络接口结构

SylixOS 协议栈学习(一)网络接口结构

       1) netif 的结构体来描述一个硬件网络接口的。
  1.     struct netif {                                                
  2.         struct netif *next;    // 指向下一个 netif 结构的指针
  3.         struct ip_addr ip_addr;    // IP 地址相关配置
  4.         struct ip_addr netmask;
  5.         struct ip_addr gw;
  6.         err_t (* input)(struct pbuf *p, structnetif *inp);    //调用这个函数可以从网卡上取得一个数据包
  7.         err_t (* output)(struct netif *netif,struct pbuf *p, struct ip_addr *ipaddr);    // IP 层调用这个函数可以向网卡发送一个数据包   
  8.         err_t (* linkoutput)(struct netif *netif,struct pbuf *p);   // ARP 模块调用这个函数向网卡发送一个数据包
  9.         void *state;    // 用户可以独立发挥该指针,用于指向用户关心的网卡信息
  10.         u8_t hwaddr_len;    // 硬件地址长度,对于以太网就是 MAC 地址长度,为 6 各字节
  11.         u8_t hwaddr[NETIF_MAX_HWADDR_LEN];    //MAC 地址
  12.         u16_t mtu;    // 一次可以传送的最大字节数,对于以太网一般设为 1500
  13.         u8_t flags;    // 网卡状态信息标志位
  14.         char name[2];    // 网络接口使用的设备驱动类型的种类
  15.         u8_t num;    // 用来标示使用同种驱动类型的不同网络接口
  16.     };
         netif 结构体中:
  1. ip_addr、 netmask、 gw 三个字段用于发送和处理数据包用,分别表示 IP 地址、子网掩码和网关地址。
  2. input 字段指向一个函数,这个函数将网卡设备接收到的数据包提交给 IP 层。
  3. output 字段指向一个函数,这个函数和具体网络接口设备驱动密切相关,它用于 IP 层将一个数据包发送到网络接口上。用户需要根据实际网卡编写该函数,并将 output 字段指向该函数。
  4. linkoutput 字段和上面的 output 基本上是起相同的作用,但是这个函数是在 ARP 模块中被调用的。
  5. state 字段可以指向用户关心的关于设备的一些信息。
  6. mtu 字段表示该网络一次可以传送的最大字节数,对于以太网一般设为 1500。
  7. flags 字段是网卡状态信息标志位,是很重要的控制字段,它包括网卡功能使能、广播使能、 ARP 使能等等重要控制位。
     2) SylixOS 通过 netdev 来描述一个网络设备
  1. typedef struct netdev {
  2.       UINT32 magic_no;    /* MUST beNETDEV_MAGIC */
  3.       UINT32 init_flags;
  4.       UINT32 chksum_flags;
  5.        UINT32 net_type;
  6.        UINT64 speed;    /* link layer speed bps */
  7.       UINT32 mtu;    /* link layer maxpacket length */
  8.       UINT8 hwaddr_len;    /* link layer address length MUST 6 or 8 */
  9.        UINT8 hwaddr[NETIF_MAX_HWADDR_LEN];    /* link layer address */
  10.       struct netdev_funcs *drv;    /* netdev driver */
  11.      void*priv;    /* user network device privatedata (私有结构,自定义)
  12.       intif_flags;
  13.       ULONG sys[254];   /* reserve for netif (存放netif结构体)*/
  14.     } netdev_t;



    • Related Articles

    • SylixOS 协议栈学习(二)以太网网卡接口部分初始化

              在《SylixOS_协议栈学习(一)网络接口结构》中,介绍了netif 结构体和netdev结构体。        下面举个例子来看一个以太网网卡接口结构是怎样被初始化,还有数据包是如何接收和发送的。     static struct netdev_funcs net_drv = {                         ①        .init      = __enetCoreInit,        .transmit  = __enetCoreTx,   ...
    • SylixOS 协议栈学习(三)ICMP 处理

           ICMP(Internet control message protocol)是网络控制报文协议,用于在IP主机跟路由器之间传输控制信息的。 控制信息指网络不通、主机是否可达、路由是否有用等。  之前在将ip4_input时,涉及到三次ICMP的东西:         1、在转发过程中,如果TTL变为0,则要用icmp_time_exceeded函数向源主机发送一份超时ICMP信息。         2、会通过ip报头,判断是否是ICMP报文,如果是,则调用icmp_input函数。 ...
    • SylixOS 协议栈学习(四)ping 工作流程

      Ping工作流程: 1、涉及协议介绍       运行ping程序时,会用到以下协议:       ICMP(因特网控制报文协议):用于IP主机、路由器直接传递控制消息(一般是差错信息,如TCP/UDP传输失败,会构建ICMP报文返回)。       IP协议:一种不可靠、无连接的传输协议(目的是为了更好的提供传输服务)。(对于TCP传输,已十分可靠,不需要在IP层再链接;UDP本身就是不可靠、无连接的协议,使用IP协议能更快传输)。     ...
    • SylixOS 下 DMA 操作带 Cache 地址时应如何保持数据一致性

            DMA只操作物理内存,不会操作Cache,但CPU却先操作Cache,这样就会造成数据不一致的问题。因此,对于一块带Cache缓冲的地址要用DMA传输的话,需要经过特殊的处理。 Linux下可以通过dma_map_single、dma_unmap_single函数来得到对应的物理地址,并根据数据的方向判断是该回写Cache还是无效Cache。 ...
    • SylixOS lite 版—基于 STM32F767 资源使用情况

      1、基本概念     代码段(text):顾名思义,代码存放的位置,在 STM32 中代码段一般存放于内置 FLASH 中; 已初始化数据段(data):已初始化数据段会分别体现在 FlASH 中和 RAM 中。因为是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM 空间。又因为有初始值,其初始值需要占用 FlASH 空间。   未初始化的数据段(bss):bss 与 data 相同的地方时它也是全局变量,运行过程中需要进行读写操作,因此占用一段 RAM ...