Common notes
lan/wan绑定的理解
网络拓扑:
- ge1 ipv4/v6双栈 不设置ipv6地址 绑定lan4
- LAN1 ipv4/v6双栈 设置ipv6地址,生成v6的默认路由,绑定lan3
- LAN/WAN绑定的转发路由与普通三层无异,经历的netfilter挂载点均有效
目前lan/wan绑定的代码:
- ge1,不设置ipv6地址,会获取bind_node
- 且获得的ipv6网关是**::/0**,而不是NULL,即使本机不存在v6的默认路由
- 出口设备是ge1
用ge1和这个全0的网关去查路由表,是查不到结果的,所以路由返回不可达,包drop掉,之前的代码里应该也考虑了bug单描述的情况
所以与ipv4的lan/wan绑定类似,bind_node的下一跳为0或者出口设备为空,可认为是存在绑定关系却绑定失败,直接drop包
根据接口名获取vlanid
常见的wan接口名可能包括wan、wan.xx、pon.xx或者lan1.xx,那么怎么获取该wan口的vlanid可以通过如下
int get_vlanid_by_ifname(char *ifname){
if(!is_wan_if(ifname))
return -1;
int vlanid = 0;
char *dotptr = NULL;
dotptr = strchr(ifname,'.');
if(dotptr)
vlanid = atoi(dotptr+1);
return vlanid;
}
判断ipv4/ipv6的地址是否为全0
ipv4地址:u32表示无符号int基本整数类型,所以可以直接与0进行比较
u32 addr4 = xxx;
if (addr4 == 0)
return 1;
ipv6地址:利用struct in6_addr进行储存,不可以直接与**::/0**进行比较
#define IN6_IS_ADDR_DEFAULT(addr6) \
(((__const u_int32 t *)(addr6))[0] == 0 \
&& ((__const u_int32 t *)(addr6))[1] == 0 \
&& ((__const u_int32 t *)(addr6))[2] == 0 \
&& ((__const u_int32 t *)(addr6))[3] == 0)