pluto中监听各个网口的500端口处理逻辑
1. pluto中监听各个网口的500端口处理逻辑
-
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的网络接口 - 获取网络接口IP并返回链表
- 通过
-
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地址,然后通过链表连接起来
-