0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

rt-thread源码分析之socket抽象层和网卡注册

冬至子 来源:happycode999 作者:happycode999 2023-11-13 12:43 次阅读

rt-thread网络架构

如图所示,rt-thread的网络分为应用层、sal_socket、netdev、协议簇(at、lwip、wiznet)、网卡驱动五层。

应用层:调用BSD Socket API实现的网络应用,如前面介绍的paho-mqtt。

sal_socket:对socket的抽象,通过网卡(netdev)的pf(sal_proto_family)调用具体的协议簇。

netdev:netdev的私有数据保存协议簇pf(sal_proto_family),pf中的family用于匹配socket需要的协议簇。

协议簇:当socekt匹配上协议簇后,pf的skt_ops调用具体的协议簇。协议簇的实现在sal_socket文件夹下的impl文件夹下,在每一类协议簇的实现中,都有一个向netdev设置协议簇的接口,如lwip中的sal_lwip_netdev_set_pf_info。这样就可以通过netdev访问到具体的协议簇。

网卡驱动:底层硬件

二 sal_socket

2.1 BSD socket

当我们在调用BSD socket写代码时,实际上是调用sal_xxx(如sal_socket),在sys/socket.h文件中,通过#define将socket转换成sal_socket的接口。

2.2 sal_init

sal_init从堆中分配出一个socket表sal_socket_table。sal_socket_table用于保存所有的sockets的信息,当需要创建一个sal_socket时,会从表中取出一个未使用的sal_socket,表的索引(数组下标)是sal_socket的描述符。

2.3 socket函数

2.3.1 socket_new

socket_new从sal_socket_table中获取一个未使用的socket,并返回描述符。

2.3.2 socket_init

socket_init根据domain在netdev_get_by_family函数中匹配netdev。socket原型为
int socket(int domain, int type, int protocol);

不同协议簇的domain值如下:

lwIP 协议栈: family = AF_INET、sec_family = AF_INET

AT Socket 协议栈: family = AF_AT、sec_family = AF_INET

WIZnet 硬件 TCP/IP 协议栈: family = AF_WIZ、sec_family = AF_INET

与之相应的,netdev私有数据所保存的协议簇sal_proto_family中有一个family字段,用于与socket进行匹配,这样socket函数通过doamin参数就可以指定使用lwip、at、wiznet三种协议簇的一种。

2.3.3 pf->skt_ops->socket

通过pf->skt_ops->socket调用具体协议簇的socket函数,如lwip的lwip_socket。

三 网卡的匹配和注册

3.1 网卡的匹配-netdev_get_by_family

for (node = &(netdev_list->list); node; node = rt_slist_next(node))
{
netdev = rt_slist_entry(node, struct netdev, list);
pf = (struct sal_proto_family *) netdev->sal_user_data;
if (pf && pf->skt_ops && pf->family == family && netdev_is_up(netdev))
{
rt_hw_interrupt_enable(level);
return netdev;
}
}

遍历netdev_list,查找与socket函数传入的domain(family)参数一致netdev。

3.2 网卡的注册-netdev_add

在component文件夹的driver文件夹下,不同网卡驱动最终会调用到netdev_add向netdev_list添加netdev,向内核注册一个网卡,以rw009为例。

rt_hw_wifi_init -> eth_device_init -> eth_device_init_with_flag -> eth_netif_device_init -> netdev_add。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TCP协议
    +关注

    关注

    1

    文章

    91

    浏览量

    12054
  • LwIP协议栈
    +关注

    关注

    0

    文章

    19

    浏览量

    7330
  • BSD
    BSD
    +关注

    关注

    0

    文章

    30

    浏览量

    10389
  • RT-Thread
    +关注

    关注

    31

    文章

    1257

    浏览量

    39810
  • MQTT
    +关注

    关注

    5

    文章

    646

    浏览量

    22389
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(十一、UART设备—源码解析)

    一文带你深入理解 RT-Thread I/O 设备模型 — UART 设备源码分析
    的头像 发表于 07-01 11:24 5343次阅读
    <b class='flag-5'>RT-Thread</b>记录(十一、UART设备—<b class='flag-5'>源码</b>解析)

    RT-thread源码移植到STM32F10x和STM32F4xx

    RT-thread源码移植到STM32F10x和STM32F4xx: 一、源码下载 点击入门->下载   在历史版本里边随便选取一个   会进入百度云盘的下载地址,里边有全部版本的源码
    的头像 发表于 11-15 09:38 2314次阅读
    <b class='flag-5'>RT-thread</b><b class='flag-5'>源码</b>移植到STM32F10x和STM32F4xx

    一文读懂RT-Thread的SAL套接字抽象

    SAL 简介为了适配更多的网络协议栈类型,避免系统对单一网络协议栈的依赖,RT-Thread 系统提供了一套 SAL(套接字抽象)组件,该组件完成对不同网络协议栈或网络实现接口的抽象
    发表于 04-08 15:44

    WIZnet软件包对接RT-Thread SAL套接字抽象实现对BSD Socket APIs的支持

    RT-Thread SAL 套接字抽象,实现对标准 BSD Socket APIs 的支持,完美的兼容多种软件包和网络功能实现,提高 WIZnet 设备兼容性。1.1 目录结构WI
    发表于 05-17 17:00

    RTT网络框架及SAL套接字抽象介绍

    RTT 中提供了标准的 BSD Socket 接口,同时也完成上面所说的两大工作。为了解决协议栈与标准 Socket 的对接,RT-Thread 提供了一套 SAL(套接字抽象
    发表于 07-28 11:40

    基于RT-Thread的FM1702源码

    RT-Thread是一款来自中国的开源嵌入式实时操作系统,包括一系列应用组件和驱动框架,如TCP/IP协议栈,虚拟文件系统,POSIX接口,图形用户界面。---(转自RTT官网)。 FM1702是无线射频的一种,现将其移植到RT-Thread操作系统中。
    发表于 12-28 10:54 15次下载

    RT-Thread发布SAL套接字抽象,带来全新物联网软件开发模式

    Socket CAN 作为Linux上CAN编程的一种方式,它简易易用,编程顺手。很多用户也想在 RT-Thread 上实现 Socket CAN 编程,这个时候就需要 SAL 上场了。只需要我们在底层使用
    发表于 07-22 12:37 2437次阅读
    <b class='flag-5'>RT-Thread</b>发布SAL套接字<b class='flag-5'>抽象</b><b class='flag-5'>层</b>,带来全新物联网软件开发模式

    RT-Thread设备模型框架及创建注册设备的实现

    RT-Thread设备模型框架及创建注册设备的实现方式介绍如下:
    的头像 发表于 05-28 10:38 2125次阅读
    <b class='flag-5'>RT-Thread</b>设备模型框架及创建<b class='flag-5'>注册</b>设备的实现

    RT-Thread操作系统的FreeRTOS兼容

    Github地址 https://github.com/RT-Thread-packages/FreeRTOS-Wrapper 期待您的 Star 本项目是2022年开源夏,RT-Thread社区
    的头像 发表于 01-14 00:55 1571次阅读

    RT-Thread文档_RT-Thread 简介

    RT-Thread文档_RT-Thread 简介
    发表于 02-22 18:22 5次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> 简介

    RT-Thread文档_RT-Thread SMP 介绍与移植

    RT-Thread文档_RT-Thread SMP 介绍与移植
    发表于 02-22 18:31 9次下载
    <b class='flag-5'>RT-Thread</b>文档_<b class='flag-5'>RT-Thread</b> SMP 介绍与移植

    浅析RT-Thread设备驱动框架

    RT-Thread 设备框架属于组件和服务,是基于 RT-Thread 内核之上的上层软件。设备框架是针对某一类外设,抽象出来的一套统一的操作方法及接入标准,可以屏蔽硬件差异,为应用
    的头像 发表于 08-07 15:39 1860次阅读

    RT-Thread源码分析网卡数据的接收和发送

    ethernetif.c是lwip的网卡接口,在该接口中处理网卡的数据接收和发送,rt-thread在该接口文件中抽象了一个eth_device,管理网络数据的收发和向内核的netde
    的头像 发表于 08-11 16:49 1634次阅读

    基于rt-threadsocket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 1286次阅读
    基于<b class='flag-5'>rt-thread</b>的<b class='flag-5'>socket</b>通信设计

    RT-Thread成为恩智浦注册合作伙伴,共同赋能工业与物联网应用开发!

    前不久,恩智浦半导体加入RT-Thread全球合作伙伴计划,成为RT-Thread高级会员合作伙伴。同时,RT-Thread现已成为恩智浦注册合作伙伴。
    的头像 发表于 03-15 09:15 801次阅读