SAL之套接字抽象层

2020-06-30

最近要做一个非常有意思的工作,就是移植SAL套接字抽象层,英文全称为socket abstract layer。

这个SAL是rt-thread为了适配更多的网络协议栈类型,避免系统对单一网络协议栈的依赖,提供的一套 SAL(套接字抽象层)组件。

但问题在于我现在想先把她给移除了,然后再慢慢添加SAL层。因此,我首先得分几个步骤:

  1. 熟悉SAL的原理和代码实现逻辑
  2. 在板子上把带SAL的可执行文件运行起来,并且可以进行通信
  3. 使用menuconfig取消SAL,并在板子上把不带SAL的可执行文件运行起来,并且可以进行通信
  4. 尝试移除
  5. 进行测试
  6. 不断进行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。

先按目录来分析一下每个源文件的作用:

  1. dfs_net.c

    这个文件很重要,因为我们知道一切皆文件嘛,那么socket也是一种特殊的文件,所以说嘛,也需要通过建立一个文件描述符嘛,也需要通过描述符来操作嘛~

  2. af_inet_at.c

    这个文件是干啥子的呢?只有使能SAL_USING_AT的时候,才会编译里面的接口。

    她的目的很简单,就是为了封装粮食,即结构体at_inet_family,然后通过接口sal_at_netdev_set_pf_info(at_socket_ops,at_netdb_ops)对AT网络接口进行初始化!

  3. 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网络接口进行初始化!

  4. proto_mbedtls.c

    则应该是提供加密的组件!

  5. net_netdb.c

    则是网络信息库,想要获取网络相关信息,这里面的接口都是对sal的再次封装。

  6. net_sockets.c

    同上一样,也是对sal的再次封装。

  7. 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

最后,我要提醒自己:

看代码的时候,不但要看接口实现,还要看数据结构。毕竟,数据结构+算法=程序~