最近要做一个非常有意思的工作,就是移植SAL套接字抽象层,英文全称为socket abstract layer。
这个SAL是rt-thread为了适配更多的网络协议栈类型,避免系统对单一网络协议栈的依赖,提供的一套 SAL(套接字抽象层)组件。
但问题在于我现在想先把她给移除了,然后再慢慢添加SAL层。因此,我首先得分几个步骤:
- 熟悉SAL的原理和代码实现逻辑
- 在板子上把带SAL的可执行文件运行起来,并且可以进行通信
- 使用menuconfig取消SAL,并在板子上把不带SAL的可执行文件运行起来,并且可以进行通信
- 尝试移除
- 进行测试
- 不断进行4和5的步骤
首先是熟悉SAL的原理和代码实现逻辑,我们可以从不同的维度分析:
通过目录查看查看sal
sal
├─dfs_net
│ dfs_net.c
│
├─impl
│ af_inet.h
│ af_inet_at.c
│ af_inet_lwip.c
│ proto_mbedtls.c
│
├─include
│ │ sal.h
│ │ sal_netdb.h
│ │ sal_socket.h
│ │ sal_tls.h
│ │
│ ├─dfs_net
│ │ │ dfs_net.h
│ │ │
│ │ └─sys_select
│ │ └─sys
│ │ select.h
│ │
│ └─socket
│ │ netdb.h
│ │
│ ├─netinet
│ │ in.h
│ │ tcp.h
│ │ udp.h
│ │
│ └─sys_socket
│ └─sys
│ socket.h
│
├─socket
│ net_netdb.c
│ net_sockets.c
│
└─src
sal_socket.c
以上是我将要做的sal的框架目录,看看文件也不是很多哈~如果只算c文件的话,只有7个哟,nicccccccccccce。
先按目录来分析一下每个源文件的作用:
-
dfs_net.c
这个文件很重要,因为我们知道一切皆文件嘛,那么socket也是一种特殊的文件,所以说嘛,也需要通过建立一个文件描述符嘛,也需要通过描述符来操作嘛~
-
af_inet_at.c
这个文件是干啥子的呢?只有使能SAL_USING_AT的时候,才会编译里面的接口。
她的目的很简单,就是为了封装粮食,即结构体at_inet_family,然后通过接口sal_at_netdev_set_pf_info(at_socket_ops,at_netdb_ops)对AT网络接口进行初始化!
-
af_inet_lwip.c
这个和af_inet_at.c是一类的,只有使能SAL_USING_LWIP的时候,才会编译里面的接口。
她的目的很简单,就是为了封装粮食,即结构体lwip_inet_family,然后通过接口sal_lwip_netdev_set_pf_info(lwip_socket_ops,lwip_netdb_ops)对LwIP网络接口进行初始化!
-
proto_mbedtls.c
则应该是提供加密的组件!
-
net_netdb.c
则是网络信息库,想要获取网络相关信息,这里面的接口都是对sal的再次封装。
-
net_sockets.c
同上一样,也是对sal的再次封装。
-
sal_socket.c
这是socket abstract layer的实现层,net*.c用的就是这里的接口
通过sconscript查看sal
首先是如果使用sal则必须要编译的:(RT_USING_SAL)
src/sal_socket.c
socket/net_netdb.c
如果使用lwIP:(SAL_USING_LWIP)
impl/af_inet_lwip.c
如果使用AT:(SAL_USING_AT)
impl/af_inet_at.c
如果使用TLS加密:(SAL_USING_TLS)
impl/proto_mbedtls.c
如果要使用POSIX:(SAL_USING_POSIX)
socket/net_sockets.c
dfs_net/dfs_net.c
最后,我要提醒自己:
看代码的时候,不但要看接口实现,还要看数据结构。毕竟,数据结构+算法=程序~