一 rt-thread網(wǎng)絡(luò)架構(gòu)
如圖所示,rt-thread的網(wǎng)絡(luò)分為應(yīng)用層、sal_socket、netdev、協(xié)議簇(at、lwip、wiznet)、網(wǎng)卡驅(qū)動五層。
應(yīng)用層:調(diào)用BSD Socket API實(shí)現(xiàn)的網(wǎng)絡(luò)應(yīng)用,如前面介紹的paho-mqtt。
sal_socket:對socket的抽象,通過網(wǎng)卡(netdev)的pf(sal_proto_family)調(diào)用具體的協(xié)議簇。
netdev:netdev的私有數(shù)據(jù)保存協(xié)議簇pf(sal_proto_family),pf中的family用于匹配socket需要的協(xié)議簇。
協(xié)議簇:當(dāng)socekt匹配上協(xié)議簇后,pf的skt_ops調(diào)用具體的協(xié)議簇。協(xié)議簇的實(shí)現(xiàn)在sal_socket文件夾下的impl文件夾下,在每一類協(xié)議簇的實(shí)現(xiàn)中,都有一個向netdev設(shè)置協(xié)議簇的接口,如lwip中的sal_lwip_netdev_set_pf_info。這樣就可以通過netdev訪問到具體的協(xié)議簇。
網(wǎng)卡驅(qū)動:底層硬件。
二 sal_socket
2.1 BSD socket
當(dāng)我們在調(diào)用BSD socket寫代碼時,實(shí)際上是調(diào)用sal_xxx(如sal_socket),在sys/socket.h文件中,通過#define將socket轉(zhuǎn)換成sal_socket的接口。
2.2 sal_init
sal_init從堆中分配出一個socket表sal_socket_table。sal_socket_table用于保存所有的sockets的信息,當(dāng)需要創(chuàng)建一個sal_socket時,會從表中取出一個未使用的sal_socket,表的索引(數(shù)組下標(biāo))是sal_socket的描述符。
2.3 socket函數(shù)
2.3.1 socket_new
socket_new從sal_socket_table中獲取一個未使用的socket,并返回描述符。
2.3.2 socket_init
socket_init根據(jù)domain在netdev_get_by_family函數(shù)中匹配netdev。socket原型為
int socket(int domain, int type, int protocol);
不同協(xié)議簇的domain值如下:
lwIP 協(xié)議棧: family = AF_INET、sec_family = AF_INET
AT Socket 協(xié)議棧: family = AF_AT、sec_family = AF_INET
WIZnet 硬件 TCP/IP 協(xié)議棧: family = AF_WIZ、sec_family = AF_INET
與之相應(yīng)的,netdev私有數(shù)據(jù)所保存的協(xié)議簇sal_proto_family中有一個family字段,用于與socket進(jìn)行匹配,這樣socket函數(shù)通過doamin參數(shù)就可以指定使用lwip、at、wiznet三種協(xié)議簇的一種。
2.3.3 pf->skt_ops->socket
通過pf->skt_ops->socket調(diào)用具體協(xié)議簇的socket函數(shù),如lwip的lwip_socket。
三 網(wǎng)卡的匹配和注冊
3.1 網(wǎng)卡的匹配-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函數(shù)傳入的domain(family)參數(shù)一致netdev。
3.2 網(wǎng)卡的注冊-netdev_add
在component文件夾的driver文件夾下,不同網(wǎng)卡驅(qū)動最終會調(diào)用到netdev_add向netdev_list添加netdev,向內(nèi)核注冊一個網(wǎng)卡,以rw009為例。
rt_hw_wifi_init -> eth_device_init -> eth_device_init_with_flag -> eth_netif_device_init -> netdev_add。
-
TCP協(xié)議
+關(guān)注
關(guān)注
1文章
101瀏覽量
12376 -
LwIP協(xié)議棧
+關(guān)注
關(guān)注
0文章
19瀏覽量
7631 -
BSD
+關(guān)注
關(guān)注
0文章
32瀏覽量
10583 -
RT-Thread
+關(guān)注
關(guān)注
32文章
1376瀏覽量
41611 -
MQTT
+關(guān)注
關(guān)注
5文章
673瀏覽量
23556
發(fā)布評論請先 登錄
RT-thread源碼移植到STM32F10x和STM32F4xx

一文讀懂RT-Thread的SAL套接字抽象層
WIZnet軟件包對接RT-Thread SAL套接字抽象層實(shí)現(xiàn)對BSD Socket APIs的支持
RTT網(wǎng)絡(luò)框架及SAL套接字抽象層介紹
基于RT-Thread的FM1702源碼
RT-Thread發(fā)布SAL套接字抽象層,帶來全新物聯(lián)網(wǎng)軟件開發(fā)模式

RT-Thread設(shè)備模型框架及創(chuàng)建注冊設(shè)備的實(shí)現(xiàn)

RT-Thread操作系統(tǒng)的FreeRTOS兼容層
淺析RT-Thread設(shè)備驅(qū)動框架
RT-Thread源碼分析之網(wǎng)卡數(shù)據(jù)的接收和發(fā)送
基于rt-thread的socket通信設(shè)計

評論