netif_add 网口 添加/修改/配置 源码分析 1

本文探讨了如何使用netif_add函数添加网络接口,并详细分析了netif_set_addr系列函数,包括设置IP地址、子网掩码和网关的方法。同时介绍了ethernetif_init函数和etharp_output在配置网络接口过程中的作用。
摘要由CSDN通过智能技术生成

添加netif_add函数 

struct netif *
netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
  struct ip_addr *gw,
  void *state,
  err_t (* init)(struct netif *netif),
  err_t (* input)(struct pbuf *p, struct netif *netif))
{
  static u8_t netifnum = 0;
/// 初始化各个参数
  /* reset new interface configuration state */
  netif->ip_addr.addr = 0;
  netif->netmask.addr = 0;
  netif->gw.addr = 0;
  netif->flags = 0;
#if LWIP_DHCP
  /* netif not under DHCP control by default */
  netif->dhcp = NULL;
#endif /* LWIP_DHCP */
#if LWIP_AUTOIP 
  /* netif not under AutoIP control by default */
  netif->autoip = NULL;
#endif /* LWIP_AUTOIP */
#if LWIP_NETIF_STATUS_CALLBACK
  netif->status_callback = NULL;
#endif /* LWIP_NETIF_STATUS_CALLBACK */
#if LWIP_NETIF_LINK_CALLBACK
  netif->link_callback = NULL;
#endif /* LWIP_NETIF_LINK_CALLBACK */
#if LWIP_IGMP
  netif->igmp_mac_filter = NULL;
#endif /* LWIP_IGMP */
#if ENABLE_LOOPBACK
  netif->loop_first = NULL;
  netif->loop_last = NULL;
#endif /* ENABLE_LOOPBACK */

  /* remember netif specific state information data */
  netif->state = state;
  netif->num = netifnum++;
  netif->input = input;
#if LWIP_NETIF_HWADDRHINT
  netif->addr_hint = NULL;
#endif /* LWIP_NETIF_HWADDRHINT*/
#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS
  netif->loop_cnt_current = 0;
#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */
/ 初始化结束

  netif_set_addr(netif, ipaddr, netmask, gw);

  /* call user specified initialization function for netif */
  if (init(netif) != ERR_OK) {
    return NULL;
  }

  /* add this netif to the list */
  netif->next = netif_list;
  netif_list = netif;
  snmp_inc_iflist();

#if LWIP_IGMP
  /* start IGMP processing */
  if (netif->flags & NETIF_FLAG_IGMP) {
    igmp_start( netif);
  }
#endif /* LWIP_IGMP */

  LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是一个网络初始化函数 `net_init()`,它用于配置网络相关的参数。 首先,在函数内部定义了一个长度为8字节的缓冲区 `buf`,用于存储MAC地址和IP地址等信息。 接下来,调用了 `netInitialize()` 函数,该函数用于初始化网络栈。 然后,调用了 `netSYS_SetHostName()` 函数,将主机名设置为 `host_name`。 注释掉了一行代码 `get_mac_addr(ip_addr)` 和 `printf("%s\n", mac_addr)`。这可能是获取MAC地址的代码和打印MAC地址的代码。 然后,调用了 `netMAC_aton()` 函数,将 `mac_addr` 的MAC地址转换为二进制表示,并存储在 `buf` 中。接着,使用 `netIF_SetOption()` 函数将转换后的MAC地址设置为网络接口的MAC地址。 接下来,通过判断 `DHCP_enabled` 的值是否为假(false),来确定网络配置模式是静态配置还是使用DHCP。如果为假,即静态配置模式,则继续执行以下代码: 首先,调用 `netDHCP_Disable()` 函数禁用DHCP功能。 然后,调用 `netIP_aton()` 函数将 `ip_addr` 的IP地址转换为二进制表示,并存储在 `buf` 中。接着,使用 `netIF_SetOption()` 函数将转换后的IP地址设置为网络接口的IP地址。 接下来,类似地,使用 `netIP_aton()` 函数将 `net_mask` 的子网掩码转换为二进制表示,并通过 `netIF_SetOption()` 函数设置网络接口的子网掩码。 然后,使用 `netIP_aton()` 函数将 `def_gw` 的默认网关地址转换为二进制表示,并通过 `netIF_SetOption()` 函数设置网络接口的默认网关。 接下来,使用 `netIP_aton()` 函数将 `pri_dns` 的主DNS服务器地址转换为二进制表示,并通过 `netIF_SetOption()` 函数设置网络接口的主DNS服务器地址。 最后,使用 `netIP_aton()` 函数将 `sec_dns` 的备用DNS服务器地址转换为二进制表示,并通过 `netIF_SetOption()` 函数设置网络接口的备用DNS服务器地址。 这样,该函数完成了网络初始化的配置,包括设置主机名、MAC地址、IP地址、子网掩码、默认网关和DNS服务器地址等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值