LWIP之(*)()函数原型:typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp)的解释和LWIP之数据传输流程

先来看个重定义:

typedef   int(*CallBack)(char *p)

重定义的解释:

1.*CallBack:CallBack是一个指针
2.(*CallBack)():指向一个函数
3.(*CallBack)(char *p):这个函数有一个参数,类型为char*
4.int(*CallBack)(char *p):这个函数有一个返回值,类型为int

最终:CallBack是一个指针,指向具有一个char*类型参数,且返回一个int型数据的函数
前面有个typedef,所以现在CallBack是这种类型的别名

如何用:

int func(char *p){
...
}
...
CallBack my_callback1 = func;//OK
CallBack my_callback2 = &func;//OK

言归正传:

再看

typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp)

err_t        就是 int8_t  也就是8位的---一个字节大小的一个int型的数据类型

这句代码就很明显了:

1.*netif_input_fn:netif_input_fn是函数指针

2.(*netif_input_fn)():指向一个函数

3.(*netif_input_fn)(struct pbuf *p, struct netif *inp)有两个参数分别是 *p和*inp

4.err_t  :函数返回值是8位的一个int型的变量

继续往下挖:

LWIP源代码中是这样使用它的,上代码

  
struct netif {
……

netif_input_fn input;
……
}

调用的时候:

     if (netif->input(p, netif) != ERR_OK)
        {
          LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
          pbuf_free(p);
          p = NULL;
        }
        else
        {
          xSemaphoreTake( s_xSemaphore, 0);
          goto TRY_GET_NEXT_FRAGMENT;
        }

netif->input(p, netif)

现在的问题:为何调用netif->input()就会运行函数tcpip_input()?

每次开机跑起来程序都要先TCPIP_Init(),代码如下:

void TCPIP_Init(void){
……
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init, &tcpip_input);
……
}

重点关注函数netif_add()的第七个参数,也就是最后一个参数

给出函数netif_add()

struct netif *netif_add( struct netif *netif,
                    const ip4_addr_t *ipaddr, 
                    onst ip4_addr_t *netmask, 
                        const ip4_addr_t *gw,
                                 void *state, 
                          netif_init_fn init, 
                        netif_input_fn input)
 {  
……
  netif->input = input;
……
}

至此,也就解决了为何调用netif->input()就会运行函数tcpip_input()的问题!

在最后继续:

给出tcpip_input()代码

err_t   tcpip_input(struct pbuf *p, struct netif *inp)
{
#if LWIP_ETHERNET
  if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {
    return tcpip_inpkt(p, inp, ethernet_input);
  } else
#endif /* LWIP_ETHERNET */
    return tcpip_inpkt(p, inp, ip_input);
}

至此,本文也就完全解释了(*input)() -> tcpip_input() -> tcpip_inpkt()这个过程!

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰俠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值