whack_handle()
find_ifaces()
find_raw_ifaces4()
socket、setsockopt、bind、ioctl、
通过ioctl(master_sock, SIOCGIFCONF, &ifconf)
获取到所有的网络配置信息(网口名称和IP地址)
通过ioctl(master_sock, SIOCGIFFLAGS, &auxinfo)
获取网卡是否处于UP状态
构建UP状态的<网口名,IP地址>链表,并返回此链表
在获取网口IP时,只能获取到该网口下的IP地址信息:
'''c
struct raw_iface {
ip_address addr; /*这里可以看出只能获取一个IP地址*/
char name[IFNAMSIZ + 20]; /* what would be a safe size? */
struct raw_iface *next;
};
'''
find_raw_ifaces6()
/proc/net/if_inet6
文件来获取IPv6的网络接口process_raw_ifaces()
ipesc
开始的接口直接跳过, 也就是说如果添加tunnel接口,这里需要确认下
mast
开始的接口直接跳过
遍历所有的接口,确保没有配置相同的接口IP地址
创建监听的套接字(绑定500和4500端口
接口采用的数据结构:
struct iface {
char *vname; /* virtual (ipsec) device name */
char *rname; /* real device name */
ip_address addr; /* interface IP address */
u_int16_t port; /* host byte order */
int fd; /* file descriptor of socket for IKE UDP messages */
struct iface *next;
#ifdef NAT_TRAVERSAL
bool ike_float;
#endif
enum { IFN_ADD, IFN_KEEP, IFN_DELETE } change;
};
全局变量:interfaces通过上述流程后便构造成功,且获取到了接口的所有IP地址,然后通过链表连接起来