//skb->pkt_type根据l2地址设置,在eth_type_trans(由驱动调用)中,如果数据帧的目的l2地址为接收接口的l2地址,设置为PACKET_HOST
//skb->rt->rt_type根据l3地址设置,在ip_route_input(由ip协议调用)中,如果数据帧的目的l3地址为本机配置的l3地址,设置为RTN_LOCAL
//调用路径ip_rcv->ip_rcv_finish->ip_options_rcv_srr
// 1.skb->dst非本机ip,
// 1.1 严路由选项,向发送方返回错误
// 1.2 宽路由选项,直接返回,继续ip_rcv_finish后续处理
// 2.skb->dst本机ip,
// 寻找源路由选项ptr指示的下一个,非本机ip的单播地址,复制到ip报头,设置ip_changed使ip校验和失效。
//根据源路由选项,选择下一跳地址,并更新skb->dst路由缓存
1.1 int ip_options_rcv_srr(struct sk_buff *skb)
{
struct ip_options *opt = &(IPCB(skb)->opt);//ip控制块,在ip_options_compile中被初始化
int srrspace, srrptr;
u32 nexthop;
struct iphdr *iph = skb->nh.iph;
unsigned char * optptr = skb->nh.raw + opt->srr;
struct rtable *rt = (struct rtable*)skb->dst;
struct rtable *rt2;
int err;
if (!opt->srr)
return 0;
if (
网络子系统44_ip协议源路由选项处理
最新推荐文章于 2021-04-13 21:41:47 发布
![](https://img-home.csdnimg.cn/images/20240611030827.png)