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

链接服务器接口:

1int connect(int s, const struct sockaddr *name, socklen_t namelen)

2

connect调用的流程大致如下:connect-》sal_connect-》at_connect/lwip_connect.

connect:SAL 组件对外提供的抽象的 BSD Socket API,用于统一 fd 管理;

sal_connect:SAL 组件中 connect 实现函数,用于调用底层协议栈注册的 operation 函数。

at_connect/lwip_connect:底层协议栈提供的层 connect 连接函数,在网卡初始化完成时注册到 SAL 组件中,最终调用的操作函数。

2.3 数据结构

网络接口设备协议簇数据结构:

了解协议栈的相关概念

SAL 套接字表数据结构:

了解协议栈的相关概念

1static struct sal_socket_table socket_table;

初始化sal套接字:

1int sal_init(void);

该初始化函数主要是对 SAL 组件进行初始化,动态申请socket_table对象。支持组件重复初始化判断,完成对组件中使用的互斥锁等资源的初始化。

如果AT组件使用了SAL 套接字,则在sal_at_netdev_set_pf_info(netdev)函数对网络接口设备协议族信息(struct sal_proto_family)进行赋值。

如果LWIP组件使用了SAL 套接字,则在sal_lwip_netdev_set_pf_info(struct netdev *netdev)函数对网络接口设备协议族信息(struct sal_proto_family)进行赋值。

2.4 SAL Socket API 介绍

1int sal_socket(int domain, int type, int protocol)

在套接字表中分配一个新的套接字和注册的套接字选项

通过套接字描述符获取sal套接字对象

初始化sal套接字对象

打开有效的网络接口套接字(at_socket/lwip_socket)

1int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen)

通过套接字描述符获取套接字对象

检查输入ipaddr是否是默认的netdev ipaddr,如果不是根据ip地址获取新的网卡设备

通过网络接口设备检查和获取协议族

调用对应驱动的bind接口(at_bind/lwip_bind)

1int sal_connect(int socket, const struct sockaddr *name, socklen_t namelen)

通过套接字描述符获取套接字对象

调用对应驱动的connect接口(at_connect/lwip_connect)

其他接口:

1int sal_accept(int socket, struct sockaddr *addr, socklen_t *addrlen)

2int sal_shutdown(int socket, int how)