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)