一 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文章
91瀏覽量
12070 -
LwIP協(xié)議棧
+關(guān)注
關(guān)注
0文章
19瀏覽量
7347 -
BSD
+關(guān)注
關(guān)注
0文章
31瀏覽量
10407 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1285瀏覽量
40071 -
MQTT
+關(guān)注
關(guān)注
5文章
650瀏覽量
22482
發(fā)布評論請先 登錄
相關(guān)推薦
評論