aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4')
-rw-r--r--net/ipv4/igmp.c3
-rw-r--r--net/ipv4/inet_diag.c9
-rw-r--r--net/ipv4/ip_forward.c2
-rw-r--r--net/ipv4/ip_options.c5
-rw-r--r--net/ipv4/netfilter/Kconfig1
-rw-r--r--net/ipv4/route.c23
6 files changed, 27 insertions, 16 deletions
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index fbc53767bf35..313ad93d2f7b 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -1721,7 +1721,8 @@ static int ip_mc_add_src(struct in_device *in_dev, __be32 *pmca, int sfmode,
1721 if (err) { 1721 if (err) {
1722 int j; 1722 int j;
1723 1723
1724 pmc->sfcount[sfmode]--; 1724 if (!delta)
1725 pmc->sfcount[sfmode]--;
1725 for (j=0; j<i; j++) 1726 for (j=0; j<i; j++)
1726 (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]); 1727 (void) ip_mc_del1_src(pmc, sfmode, &psfsrc[j]);
1727 } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) { 1728 } else if (isexclude != (pmc->sfcount[MCAST_EXCLUDE] != 0)) {
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c
index bbebdecd7234..0a46c541b477 100644
--- a/net/ipv4/inet_diag.c
+++ b/net/ipv4/inet_diag.c
@@ -108,9 +108,6 @@ static int inet_csk_diag_fill(struct sock *sk,
108 icsk->icsk_ca_ops->name); 108 icsk->icsk_ca_ops->name);
109 } 109 }
110 110
111 if ((ext & (1 << (INET_DIAG_TOS - 1))) && (sk->sk_family != AF_INET6))
112 RTA_PUT_U8(skb, INET_DIAG_TOS, inet->tos);
113
114 r->idiag_family = sk->sk_family; 111 r->idiag_family = sk->sk_family;
115 r->idiag_state = sk->sk_state; 112 r->idiag_state = sk->sk_state;
116 r->idiag_timer = 0; 113 r->idiag_timer = 0;
@@ -125,6 +122,12 @@ static int inet_csk_diag_fill(struct sock *sk,
125 r->id.idiag_src[0] = inet->inet_rcv_saddr; 122 r->id.idiag_src[0] = inet->inet_rcv_saddr;
126 r->id.idiag_dst[0] = inet->inet_daddr; 123 r->id.idiag_dst[0] = inet->inet_daddr;
127 124
125 /* IPv6 dual-stack sockets use inet->tos for IPv4 connections,
126 * hence this needs to be included regardless of socket family.
127 */
128 if (ext & (1 << (INET_DIAG_TOS - 1)))
129 RTA_PUT_U8(skb, INET_DIAG_TOS, inet->tos);
130
128#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE) 131#if defined(CONFIG_IPV6) || defined (CONFIG_IPV6_MODULE)
129 if (r->idiag_family == AF_INET6) { 132 if (r->idiag_family == AF_INET6) {
130 const struct ipv6_pinfo *np = inet6_sk(sk); 133 const struct ipv6_pinfo *np = inet6_sk(sk);
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
index 3b34d1c86270..29a07b6c7168 100644
--- a/net/ipv4/ip_forward.c
+++ b/net/ipv4/ip_forward.c
@@ -84,7 +84,7 @@ int ip_forward(struct sk_buff *skb)
84 84
85 rt = skb_rtable(skb); 85 rt = skb_rtable(skb);
86 86
87 if (opt->is_strictroute && ip_hdr(skb)->daddr != rt->rt_gateway) 87 if (opt->is_strictroute && opt->nexthop != rt->rt_gateway)
88 goto sr_failed; 88 goto sr_failed;
89 89
90 if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) && 90 if (unlikely(skb->len > dst_mtu(&rt->dst) && !skb_is_gso(skb) &&
diff --git a/net/ipv4/ip_options.c b/net/ipv4/ip_options.c
index 05d20cca9d66..1e60f7679075 100644
--- a/net/ipv4/ip_options.c
+++ b/net/ipv4/ip_options.c
@@ -568,12 +568,13 @@ void ip_forward_options(struct sk_buff *skb)
568 ) { 568 ) {
569 if (srrptr + 3 > srrspace) 569 if (srrptr + 3 > srrspace)
570 break; 570 break;
571 if (memcmp(&ip_hdr(skb)->daddr, &optptr[srrptr-1], 4) == 0) 571 if (memcmp(&opt->nexthop, &optptr[srrptr-1], 4) == 0)
572 break; 572 break;
573 } 573 }
574 if (srrptr + 3 <= srrspace) { 574 if (srrptr + 3 <= srrspace) {
575 opt->is_changed = 1; 575 opt->is_changed = 1;
576 ip_rt_get_source(&optptr[srrptr-1], skb, rt); 576 ip_rt_get_source(&optptr[srrptr-1], skb, rt);
577 ip_hdr(skb)->daddr = opt->nexthop;
577 optptr[2] = srrptr+4; 578 optptr[2] = srrptr+4;
578 } else if (net_ratelimit()) 579 } else if (net_ratelimit())
579 printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n"); 580 printk(KERN_CRIT "ip_forward(): Argh! Destination lost!\n");
@@ -640,7 +641,7 @@ int ip_options_rcv_srr(struct sk_buff *skb)
640 } 641 }
641 if (srrptr <= srrspace) { 642 if (srrptr <= srrspace) {
642 opt->srr_is_hit = 1; 643 opt->srr_is_hit = 1;
643 iph->daddr = nexthop; 644 opt->nexthop = nexthop;
644 opt->is_changed = 1; 645 opt->is_changed = 1;
645 } 646 }
646 return 0; 647 return 0;
diff --git a/net/ipv4/netfilter/Kconfig b/net/ipv4/netfilter/Kconfig
index 1dfc18a03fd4..f19f2182894c 100644
--- a/net/ipv4/netfilter/Kconfig
+++ b/net/ipv4/netfilter/Kconfig
@@ -325,7 +325,6 @@ config IP_NF_TARGET_TTL
325# raw + specific targets 325# raw + specific targets
326config IP_NF_RAW 326config IP_NF_RAW
327 tristate 'raw table support (required for NOTRACK/TRACE)' 327 tristate 'raw table support (required for NOTRACK/TRACE)'
328 depends on NETFILTER_ADVANCED
329 help 328 help
330 This option adds a `raw' table to iptables. This table is the very 329 This option adds a `raw' table to iptables. This table is the very
331 first in the netfilter framework and hooks in at the PREROUTING 330 first in the netfilter framework and hooks in at the PREROUTING
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 0c74da8a0473..fb47c8f0cd86 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -138,7 +138,7 @@ static int rt_chain_length_max __read_mostly = 20;
138 138
139static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie); 139static struct dst_entry *ipv4_dst_check(struct dst_entry *dst, u32 cookie);
140static unsigned int ipv4_default_advmss(const struct dst_entry *dst); 140static unsigned int ipv4_default_advmss(const struct dst_entry *dst);
141static unsigned int ipv4_default_mtu(const struct dst_entry *dst); 141static unsigned int ipv4_mtu(const struct dst_entry *dst);
142static void ipv4_dst_destroy(struct dst_entry *dst); 142static void ipv4_dst_destroy(struct dst_entry *dst);
143static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst); 143static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst);
144static void ipv4_link_failure(struct sk_buff *skb); 144static void ipv4_link_failure(struct sk_buff *skb);
@@ -193,7 +193,7 @@ static struct dst_ops ipv4_dst_ops = {
193 .gc = rt_garbage_collect, 193 .gc = rt_garbage_collect,
194 .check = ipv4_dst_check, 194 .check = ipv4_dst_check,
195 .default_advmss = ipv4_default_advmss, 195 .default_advmss = ipv4_default_advmss,
196 .default_mtu = ipv4_default_mtu, 196 .mtu = ipv4_mtu,
197 .cow_metrics = ipv4_cow_metrics, 197 .cow_metrics = ipv4_cow_metrics,
198 .destroy = ipv4_dst_destroy, 198 .destroy = ipv4_dst_destroy,
199 .ifdown = ipv4_dst_ifdown, 199 .ifdown = ipv4_dst_ifdown,
@@ -1814,12 +1814,17 @@ static unsigned int ipv4_default_advmss(const struct dst_entry *dst)
1814 return advmss; 1814 return advmss;
1815} 1815}
1816 1816
1817static unsigned int ipv4_default_mtu(const struct dst_entry *dst) 1817static unsigned int ipv4_mtu(const struct dst_entry *dst)
1818{ 1818{
1819 unsigned int mtu = dst->dev->mtu; 1819 const struct rtable *rt = (const struct rtable *) dst;
1820 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
1821
1822 if (mtu && rt_is_output_route(rt))
1823 return mtu;
1824
1825 mtu = dst->dev->mtu;
1820 1826
1821 if (unlikely(dst_metric_locked(dst, RTAX_MTU))) { 1827 if (unlikely(dst_metric_locked(dst, RTAX_MTU))) {
1822 const struct rtable *rt = (const struct rtable *) dst;
1823 1828
1824 if (rt->rt_gateway != rt->rt_dst && mtu > 576) 1829 if (rt->rt_gateway != rt->rt_dst && mtu > 576)
1825 mtu = 576; 1830 mtu = 576;
@@ -2755,9 +2760,11 @@ static struct dst_entry *ipv4_blackhole_dst_check(struct dst_entry *dst, u32 coo
2755 return NULL; 2760 return NULL;
2756} 2761}
2757 2762
2758static unsigned int ipv4_blackhole_default_mtu(const struct dst_entry *dst) 2763static unsigned int ipv4_blackhole_mtu(const struct dst_entry *dst)
2759{ 2764{
2760 return 0; 2765 unsigned int mtu = dst_metric_raw(dst, RTAX_MTU);
2766
2767 return mtu ? : dst->dev->mtu;
2761} 2768}
2762 2769
2763static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu) 2770static void ipv4_rt_blackhole_update_pmtu(struct dst_entry *dst, u32 mtu)
@@ -2775,7 +2782,7 @@ static struct dst_ops ipv4_dst_blackhole_ops = {
2775 .protocol = cpu_to_be16(ETH_P_IP), 2782 .protocol = cpu_to_be16(ETH_P_IP),
2776 .destroy = ipv4_dst_destroy, 2783 .destroy = ipv4_dst_destroy,
2777 .check = ipv4_blackhole_dst_check, 2784 .check = ipv4_blackhole_dst_check,
2778 .default_mtu = ipv4_blackhole_default_mtu, 2785 .mtu = ipv4_blackhole_mtu,
2779 .default_advmss = ipv4_default_advmss, 2786 .default_advmss = ipv4_default_advmss,
2780 .update_pmtu = ipv4_rt_blackhole_update_pmtu, 2787 .update_pmtu = ipv4_rt_blackhole_update_pmtu,
2781 .cow_metrics = ipv4_rt_blackhole_cow_metrics, 2788 .cow_metrics = ipv4_rt_blackhole_cow_metrics,