ARP条目的类型:
/* ARP Flag values. */
#define ATF_COM 0x02 /* completed entry (ha valid) */
#define ATF_PERM 0x04 /* permanent entry */
#define ATF_PUBL 0x08 /* publish entry */
#define ATF_USETRAILERS 0x10 /* has requested trailers */
#define ATF_NETMASK 0x20 /* want to use a netmask (only
for proxy entries) */
#define ATF_DONTPUB 0x40 /* don't answer this addresses */
什么时候会发送ARP查询,目的IP和你网卡知道的IP在同一网段的才会发送ARP请求,比如,网卡IP为192.168.1.102,那ping 192.168.1.0的IP会发送ARP请求MAC地址。如果网卡IP为192.168.1.102,网关设置为192.168.10.1,那ping 192.168.1.0和192.168.10.0两个网段才会发送ARP请求,ping其他网段的IP都直接发送ICMP包。
所以我们说ARP是邻居协议,不存在被转发的情况。
————
struct sk_buff是socket buffer结构,
sk_buff的head和end指向给数据预分配的内存的起始和结束位置,data和tail指向实际已填充的数据起始和结束位置。
skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)函数用于在skb的head和data之间多分配点儿空间, data的内容整体后移,headroom是多分配的长度。。
ip_route_input()负责选择路由:
ip_route_input()
if (在路由缓存rt_hash_table里找到) //匹配srcip/dstip/in_if/out_if/net_ns/tos类型(如IPTOS_LOWDELAY)等。
skb_dst_set(skb, &rth->u.dst);
else
ip_route_input_slow() //从路由表fib中去找
if (res.type == RTN_LOCAL) //本地
rth->u.dst.input= ip_local_deliver;
else //转发
ip_mkroute_input()
-> __mkroute_input()
rth->u.dst.inpu