协议栈内部使用netif的结构体来描述网络接口,先来看一下这个结构体。
/* netif结构体 */
struct netif {
struct netif *next; //用于将netif连接成链表
/* IP地址、子网掩码、网关地址 */
struct ip_addr ip_addr;
struct ip_addr netmask;
struct ip_addr gw;
/* 向IP层输入数据包 */
err_t (* input)(struct pbuf *p, struct netif *inp);
/* 发送IP层数据包(先通过ARP查找目的MAC,再调用linkoutput) */
err_t (* output)(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);
/* 底层数据包发送 */
err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
/* 用户字段 */
void *state;
/* 最大允许数据包长度 */
u16_t mtu;
/* 物理MAC地址 */
u8_t hwaddr_len;
u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
u8_t flags; //标志位
char name[2]; //网络接口名字
u8_t num; //网路接口编号
};
关于标志位的定义如下
/* 网络接口标志位 */
#define NETIF_FLAG_UP 0x01U /* 网络接口是否已被上层使能 */
#define NETIF_FLAG_BROADCAST 0x02U /* 网络接口是否支持广播 */
#define NETIF_FLAG_POINTTOPOINT 0x04U /* 网络接口是