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

2023-05-16

先来看个重定义:

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()这个过程!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • linux idea无法输入中文

    linux idea无法输入中文 1 系统输入法切换快捷键 xff08 ctrl 43 space xff09 与idea快捷键冲突 xff0c 更改输入法快捷键 xff0c 如改为 ctrl 43 6
  • linux设置systemd服务

    linux设置systemd服务 access dir etc systemd system create file whose name ended with service chmod 644 xx service edit xx se
  • 普通用户使用docker命令

    普通用户使用docker命令 add docker group sudo cat etc group docker sudo groupadd g 999 docker add user to docker group sudo gpass
  • samba服务器

    samba服务器 install samba edit etc samba smb conf default comment 61 default path 61 opt es backups valid users 61 zsk13 wr
  • linux安装mongodb

    install mongodb tar zxvf mongodb linux x86 64 4 0 22 tgz useradd mongod init passwd with mongod passwd mongod mkdir for
  • linux制作iso启动盘

    制作iso启动盘 sudo fdisk l umount dev sdb umount dev sdb1 umount dev sdd2 umount dev sdd3 sudo mkfs ext4 dev sdb sudo dd if 6
  • ros2+opencv抓取rtsp视频流

    遇到的坑 xff1a rtsp视频流和转ros2 topic放到一个线程里 xff0c 频繁提示解码丢帧的情况 解决这个问题需要将opencv获取rtsp视频流单独开一个线程 xff0c 不能在里面处理任何多余的代码 代码如下 xff1a
  • 机械臂标定实战

    硬件资源 xff1a 机械臂viper300 摄像头realsense d435i 软件版本 xff1a 操作系统 xff1a Ubuntu18 04 ROS Melodic 标定算法 xff1a 采用easy handeye 算法包 ht
  • Linux 下的 Docker 安装及创建私有仓(三)

    Linux 下的 Docker 安装及创建私有仓 xff08 三 xff09 辛苦打工人 xff0c 今天继续搬砖 xff0c 搞搞私有仓用户和密码 废话不说 xff0c 开工 xff01 1 安装httpd tools 授权需要用到 xf
  • .Net Core Web API 发布到Linux Docker(一)

    Net Core Web API 发布到Linux Docker xff08 一 xff09 Net Core Web API 项目已经建好 xff0c 想要发布到Linux Docker 上 xff0c 具体研究了一下 xff0c 发现有
  • 设置mysql允许外网访问

    mysql的root账户 我在连接时通常用的是localhost或127 0 0 1 公司的测试服务器上的mysql也是localhost所以我想访问无法访问 测试暂停 解决方法如下 1 修改表 登录mysql数据库 切换到mysql数据库
  • .Net Core Web API 发布到Linux Docker(二)

    Net Core Web API 发布到Linux Docker xff08 二 xff09 本章将尝试 Net Core Web API 直接发布到私有仓 Net Core Web API 直接发布到Docker私有仓 1 选择需要发布的
  • .Net Core微服务入门——Consul集群搭建(一)

    Net Core微服务入门 Consul集群搭建 xff08 一 xff09 前几天一直在本地机器试用Consul xff0c 今天特意在服务器上试试 xff0c 并搭建下集群 一 服务器安装consul 获取镜像 docker pull
  • .Net Core微服务入门——Consul集群搭建(二)

    Net Core微服务入门 Consul集群搭建 xff08 二 xff09 1 先启动第一个consul服务 xff1a consul1 docker run name consul1 d p 8500 span class token
  • .Net Core微服务入门——Consul集群搭建(三)

    Net Core微服务入门 Consul集群搭建 xff08 三 xff09 本章将介绍 Consul 集群 Client 还记得第一篇中 xff0c 我们再Consul中启动了2个MyAPI服务么 xff0c 我们重启下 xff0c 看下
  • .Net Core微服务入门——Consul集群搭建(四)

    Net Core微服务入门 Consul集群搭建 xff08 四 xff09 多台服务器集群搭建 1 先关闭几台集群服务器防火墙 当然 xff0c 不关闭也可以 xff0c 那就必须开通端口权限 consul 涉及的端口 xff1a 850
  • Docker 同一主机容器间通信

    Docker 容器间通信 本文我们采用bridge网络通信 1 创建bridge网络 docker network create testnet 2 查看Docker网络 docker network ls 3 运行容器连接到testnet
  • Centos7端口查看开放,防火墙开启关闭命令等

    1 开放 关闭端口 开放5001端口 firewall cmd zone 61 public add port 61 5001 tcp permanent 关闭5001端口 firewall cmd zone 61 public remov
  • .Net Core微服务入门——Ocelot API网关接入(一)

    Net Core微服务入门 Ocelot API网关接入 上一章我们测试了一个简单的Client 端访问Consul实现服务注册与发现 xff0c 但是现实生产环境我们直接通过Client自行连接Consul实现服务注册与发现 xff0c
  • .Net Core微服务入门——Ocelot API网关接入(二)

    Net Core微服务入门 Ocelot API网关接入 xff08 二 xff09 我们先接入Consul xff0c 实现服务发现 服务发现 1 引入 Ocelot Provider Consul 包 2 修改ocelot json x

随机推荐