如圖所示,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瀏覽量
12090 -
LwIP協議棧
+關注
關注
0文章
19瀏覽量
7396 -
BSD
+關注
關注
0文章
31瀏覽量
10424 -
RT-Thread
+關注
關注
31文章
1293瀏覽量
40228 -
MQTT
+關注
關注
5文章
651瀏覽量
22551
發布評論請先 登錄
相關推薦
評論