zynq Lwip学习笔记-xemacif_input函数

前言

最近在学习zynq中的lwip协议族,找不到很好的记笔记的地方,所以就用csdn记录一下自己的学习过程。现在对lwip不熟悉,只是把官方的lwip echo server例程跑了一下,能跑通就一点点的照着学了,笔记都是根据自己的理解写的,而且部分内容可能也只针对lwip echo server例程有效,笔记可以供有缘人参考,但不敢保证全对,有不对的地方也期待有高人指点一二。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_40356705/article/details/136824649

一、概述

  • 原型
intxemacif_input(struct netif *netif)
  • 参数
    struct netif *netif :代表当前处理的网络接口。

netif结构体是LwIP协议栈中用于描述网络接口的关键数据结构,这里多解释一下。
它包含了网络接口的各种信息,使得LwIP能够与网络硬件进行交互,并处理网络数据的接收和发送。
netif结构体的主要组成部分包括:
基本接口信息:这部分通常包括IP地址(ipaddr)、子网掩码(netmask)和默认网关(gw)。这些信息对于网络层协议来说是必不可少的,它们用于确定网络接口在网络中的位置以及如何与其他网络节点进行通信。
输入输出函数指针:netif结构体包含了一系列函数指针,这些函数指针指向用于处理网络数据接收和发送的函数。例如,input字段通常指向一个函数,该函数负责将网卡接收到的数据交给IP层进行处理;output字段则指向一个函数,当IP层需要发送一个数据包时,会调用这个函数。
链路层输出函数:linkoutput字段是一个函数指针,通常被ARP(地址解析协议)模块调用,用于完成网络数据的发送。这个函数负责将数据从网络层传递到链路层,并最终通过网卡发送出去。
接口状态与属性:flags字段用于存储网络接口的状态和属性信息,例如接口是否已启用、是否处于链接状态等。这些信息对于网络管理和故障排查非常有用。
编号与链表指针:num字段通常用于为网络接口设置一个唯一的编号,以便在系统中进行标识。next字段则是一个指向下一个netif结构体的指针,用于将多个网络接口连接成一个链表。这样,LwIP就可以同时支持多个网络接口,并为它们提供统一的管理和访问机制。
通过netif结构体,LwIP协议栈能够实现对网络接口的抽象和统一处理,使得不同的网络接口能够以相同的方式与协议栈进行交互。这使得LwIP能够灵活地适应不同的硬件平台和网络环境,为嵌入式系统和物联网应用提供高效、稳定的网络通信功能。

  • 作用

此函数,对于每种EMAC类型,都使用了预处理器指令来检查是否定义了特定的宏。如果定义了相应的宏,则调用对应的处理函数来处理网络输入;如果没有定义,则打印错误信息并进入无限循环,这通常是因为编译时配置不正确或者不支持某种EMAC类型。此外,无限循环的使用可能是一个错误处理策略,用于在检测到严重配置问题时阻止程序进一步执行。在实际应用中,可能需要更精细的错误处理机制,比如返回错误码或记录日志等。

二、函数体

int xemacif_input(struct netif *netif)
{
    // 从netif结构体中获取状态信息,并将其转换为xemac_s结构体的指针
    struct xemac_s *emac = (struct xemac_s *)netif->state;

    // 初始化一个变量n_packets,用于记录处理的包的数量
    int n_packets = 0;

    // 使用switch语句根据emac的type字段来决定如何处理输入
    switch (emac->type)
    {
        // 如果emac的类型是xemac_type_xps_emaclite
        case xemac_type_xps_emaclite:
            // 检查是否定义了XLWIP_CONFIG_INCLUDE_EMACLITE
#ifdef XLWIP_CONFIG_INCLUDE_EMACLITE
            // 如果定义了,则调用xemacliteif_input函数处理输入,并将返回值赋给n_packets
            n_packets = xemacliteif_input(netif);
            break;
#else
            // 如果没有定义,则打印错误信息
            print("incorrect configuration: xps_ethernetlite drivers not present?");
            // 进入无限循环,可能是因为配置错误,程序无法继续执行
            while(1);
            // 提前返回0,因为不会执行到return n_packets;
            return 0;
#endif

        // 如果emac的类型是xemac_type_axi_ethernet
        case xemac_type_axi_ethernet:
            // 检查是否定义了XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
#ifdef XLWIP_CONFIG_INCLUDE_AXI_ETHERNET
            // 如果定义了,则调用xaxiemacif_input函数处理输入,并将返回值赋给n_packets
            n_packets = xaxiemacif_input(netif);
            break;
#else
            // 如果没有定义,则打印错误信息
            print("incorrect configuration: axi_ethernet drivers not present?");
            // 进入无限循环
            while(1);
            // 提前返回0
            return 0;
#endif

        // 如果是在ARM或ARM64架构上编译此代码
#if defined (__arm__) || defined (__aarch64__)
            // 如果emac的类型是xemac_type_emacps
            case xemac_type_emacps:
                // 检查是否定义了XLWIP_CONFIG_INCLUDE_GEM
#ifdef XLWIP_CONFIG_INCLUDE_GEM
                // 如果定义了,则调用xemacpsif_input函数处理输入,并将返回值赋给n_packets
                n_packets = xemacpsif_input(netif);
                break;
#else
                // 如果没有定义,则打印错误信息
                xil_printf("incorrect configuration: ps7_ethernet drivers not present?\r\n");
                // 进入无限循环
                while(1);
                // 提前返回0
                return 0;
#endif
#endif

        // 如果emac的类型不是上述任何一种
        default:
            // 打印错误信息
            print("incorrect configuration: unknown temac type");
            // 进入无限循环
            while(1);
            // 提前返回0
            return 0;
    }

    // 返回处理的包的数量
    return n_packets;
}

三、调用关系

被main调用,根据硬件情况选择不同的macif函数调用。在echo server例程中,由于使用的是ps端的网口,实际运行xemacpsif_input

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值