ipv4: Save nexthop address of LSRR/SSRR option to IPCB.
Subsystems (3)
PATCH 1/1 ipv4: Save nexthop address of LSRR/SSRR option to IPCB.
We can not update iph->daddr in ip_options_rcv_srr(), It is too early. When some exception ocurred later (eg. in ip_forward() when goto sr_failed) we need the ip header be identical to the original one as ICMP need it.
Add a field 'nexthop' in struct ip_options to save nexthop of LSRR or SSRR option.
--- include/net/inet_sock.h | 2 ++ net/ipv4/ip_forward.c | 2 +- net/ipv4/ip_options.c | 5 +++-- 3 files changed, 6 insertions(+), 3 deletions(-)
include/net/inet_sock.h +2 -0
@@ -31,6 +31,7 @@/** struct ip_options - IP Options * * @faddr - Saved first hop address +* @nexthop - Saved nexthop address in LSRR and SSRR * @is_data - Options in __data, rather than skb * @is_strictroute - Strict source route * @srr_is_hit - Packet destination addr was our one
@@ -41,6 +42,7 @@*/ struct ip_options {__be32 faddr; +__be32 nexthop;unsigned char optlen;unsigned char srr;unsigned char rr;
net/ipv4/ip_forward.c +1 -1
@@ -84,7 +84,7 @@ int ip_forward(struct sk_buff *skb) rt =skb_rtable (skb); -if (opt->is_strictroute &&ip_hdr (skb)->daddr != rt->rt_gateway) +if (opt->is_strictroute && opt->nexthop != rt->rt_gateway) goto sr_failed; if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) &&
net/ipv4/ip_options.c +3 -2
@@ -568,12 +568,13 @@ void ip_forward_options(struct sk_buff *skb) ) {if (srrptr +3 > srrspace)break ; -if (memcmp (&ip_hdr (skb)->daddr, &optptr[srrptr-1 ],4 ) ==0 ) +if (memcmp (&opt->nexthop, &optptr[srrptr-1 ],4 ) ==0 )break ; }if (srrptr +3 <= srrspace) { opt->is_changed =1 ;ip_rt_get_source (&optptr[srrptr-1 ], skb, rt); +ip_hdr (skb)->daddr = opt->nexthop; optptr[2 ] = srrptr+4 ; }else if (net_ratelimit ())printk (KERN_CRIT "ip_forward(): Argh! Destination lost!\n" );
@@ -640,7 +641,7 @@ int ip_options_rcv_srr(struct sk_buff *skb) }if (srrptr <= srrspace) { opt->srr_is_hit =1 ; - iph->daddr = nexthop; + opt->nexthop = nexthop; opt->is_changed =1 ; }return 0 ;
Signature · 1 line
1.7.3.2
From: Li Wei <[email protected]>
Date: Wed, 23 Nov 2011 17:33:10 +0800
Quoted 9 lines
We can not update
iph->daddrinip_options_rcv_srr(), It is too early. When some exception ocurred later (eg. inip_forward()when gotosr_failed) we need the ip header be identical to the original one as ICMP need it.Add a field 'nexthop' in struct
ip_optionsto save nexthop of LSRR or SSRR option.Signed-off-by Li Wei <[email protected]>
Applied, thanks.