ipv4: Namespaceify ip_default_ttl sysctl knob
authorNikolay Borisov <kernel@kyup.com>
Mon, 15 Feb 2016 10:11:27 +0000 (12:11 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Feb 2016 01:42:54 +0000 (20:42 -0500)
Signed-off-by: Nikolay Borisov <kernel@kyup.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/netns/ipv4.h
include/net/route.h
net/bridge/netfilter/nft_reject_bridge.c
net/ipv4/ip_output.c
net/ipv4/ip_sockglue.c
net/ipv4/netfilter/ipt_SYNPROXY.c
net/ipv4/proc.c
net/ipv4/sysctl_net_ipv4.c

index 848fe80565343dfd864363afd910683e66595f92..bc8f7f94abcb02419d1c906cef838fa3ba3b2449 100644 (file)
@@ -80,6 +80,7 @@ struct netns_ipv4 {
        int sysctl_tcp_ecn;
        int sysctl_tcp_ecn_fallback;
 
+       int sysctl_ip_default_ttl;
        int sysctl_ip_no_pmtu_disc;
        int sysctl_ip_fwd_use_pmtu;
        int sysctl_ip_nonlocal_bind;
index a3b9ef74a3895dbce95b0eba9b4bb298f7be9d71..9b0a523bb4280023e4429fcc5379cb5d2d2d419a 100644 (file)
@@ -329,14 +329,13 @@ static inline int inet_iif(const struct sk_buff *skb)
        return skb->skb_iif;
 }
 
-extern int sysctl_ip_default_ttl;
-
 static inline int ip4_dst_hoplimit(const struct dst_entry *dst)
 {
        int hoplimit = dst_metric_raw(dst, RTAX_HOPLIMIT);
+       struct net *net = dev_net(dst->dev);
 
        if (hoplimit == 0)
-               hoplimit = sysctl_ip_default_ttl;
+               hoplimit = net->ipv4.sysctl_ip_default_ttl;
        return hoplimit;
 }
 
index fdba3d9fbff3bac00b8acc68d1eaeda2e492e820..adc8d7221dbbc135fa3506a713c70c1130c51ad6 100644 (file)
@@ -48,6 +48,7 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb,
        struct iphdr *niph;
        const struct tcphdr *oth;
        struct tcphdr _oth;
+       struct net *net = sock_net(oldskb->sk);
 
        if (!nft_bridge_iphdr_validate(oldskb))
                return;
@@ -63,9 +64,9 @@ static void nft_reject_br_send_v4_tcp_reset(struct sk_buff *oldskb,
 
        skb_reserve(nskb, LL_MAX_HEADER);
        niph = nf_reject_iphdr_put(nskb, oldskb, IPPROTO_TCP,
-                                  sysctl_ip_default_ttl);
+                                  net->ipv4.sysctl_ip_default_ttl);
        nf_reject_ip_tcphdr_put(nskb, oldskb, oth);
-       niph->ttl       = sysctl_ip_default_ttl;
+       niph->ttl       = net->ipv4.sysctl_ip_default_ttl;
        niph->tot_len   = htons(nskb->len);
        ip_send_check(niph);
 
@@ -85,6 +86,7 @@ static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb,
        void *payload;
        __wsum csum;
        u8 proto;
+       struct net *net = sock_net(oldskb->sk);
 
        if (oldskb->csum_bad || !nft_bridge_iphdr_validate(oldskb))
                return;
@@ -119,7 +121,7 @@ static void nft_reject_br_send_v4_unreach(struct sk_buff *oldskb,
 
        skb_reserve(nskb, LL_MAX_HEADER);
        niph = nf_reject_iphdr_put(nskb, oldskb, IPPROTO_ICMP,
-                                  sysctl_ip_default_ttl);
+                                  net->ipv4.sysctl_ip_default_ttl);
 
        skb_reset_transport_header(nskb);
        icmph = (struct icmphdr *)skb_put(nskb, sizeof(struct icmphdr));
index 64878efa045c132d1ce511c326c2da04fc77a895..f734c42acdaf960e7bfdbae050fb64f4108b66d6 100644 (file)
@@ -79,9 +79,6 @@
 #include <linux/netlink.h>
 #include <linux/tcp.h>
 
-int sysctl_ip_default_ttl __read_mostly = IPDEFTTL;
-EXPORT_SYMBOL(sysctl_ip_default_ttl);
-
 static int
 ip_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
            unsigned int mtu,
index 92808f147ef5bafa61ce538ec5cb99df8945e45d..3f1befc4e17b244e4f356b0ccf7fb863e80850e3 100644 (file)
@@ -1341,10 +1341,13 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,
                val = inet->tos;
                break;
        case IP_TTL:
+       {
+               struct net *net = sock_net(sk);
                val = (inet->uc_ttl == -1 ?
-                      sysctl_ip_default_ttl :
+                      net->ipv4.sysctl_ip_default_ttl :
                       inet->uc_ttl);
                break;
+       }
        case IP_HDRINCL:
                val = inet->hdrincl;
                break;
index 5fdc556514bac3335f0c4f78b2c01c54f1c8b68f..7b8fbb35287785ff4cf3168c47a2e251969e8254 100644 (file)
@@ -21,6 +21,7 @@ static struct iphdr *
 synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr)
 {
        struct iphdr *iph;
+       struct net *net = sock_net(skb->sk);
 
        skb_reset_network_header(skb);
        iph = (struct iphdr *)skb_put(skb, sizeof(*iph));
@@ -29,7 +30,7 @@ synproxy_build_ip(struct sk_buff *skb, __be32 saddr, __be32 daddr)
        iph->tos        = 0;
        iph->id         = 0;
        iph->frag_off   = htons(IP_DF);
-       iph->ttl        = sysctl_ip_default_ttl;
+       iph->ttl        = net->ipv4.sysctl_ip_default_ttl;
        iph->protocol   = IPPROTO_TCP;
        iph->check      = 0;
        iph->saddr      = saddr;
index 3abd9d7a3adf323bd688b1ab6dabda1248c67be1..9f665b63a927202b9aaf2b6b3d42205058a2ae59 100644 (file)
@@ -390,7 +390,7 @@ static int snmp_seq_show(struct seq_file *seq, void *v)
 
        seq_printf(seq, "\nIp: %d %d",
                   IPV4_DEVCONF_ALL(net, FORWARDING) ? 1 : 2,
-                  sysctl_ip_default_ttl);
+                  net->ipv4.sysctl_ip_default_ttl);
 
        BUILD_BUG_ON(offsetof(struct ipstats_mib, mibs) != 0);
        for (i = 0; snmp4_ipstats_list[i].name != NULL; i++)
index b537338f5c97d0d09c80fa2f8f19f26f0c270be7..a833a9f9e4cd35cea2d5215504dfa159cd10034b 100644 (file)
@@ -282,15 +282,6 @@ static struct ctl_table ipv4_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
-       {
-               .procname       = "ip_default_ttl",
-               .data           = &sysctl_ip_default_ttl,
-               .maxlen         = sizeof(int),
-               .mode           = 0644,
-               .proc_handler   = proc_dointvec_minmax,
-               .extra1         = &ip_ttl_min,
-               .extra2         = &ip_ttl_max,
-       },
        {
                .procname       = "tcp_max_orphans",
                .data           = &sysctl_tcp_max_orphans,
@@ -752,6 +743,15 @@ static struct ctl_table ipv4_net_table[] = {
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
+       {
+               .procname       = "ip_default_ttl",
+               .data           = &init_net.ipv4.sysctl_ip_default_ttl,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_minmax,
+               .extra1         = &ip_ttl_min,
+               .extra2         = &ip_ttl_max,
+       },
        {
                .procname       = "ip_local_port_range",
                .maxlen         = sizeof(init_net.ipv4.ip_local_ports.range),
@@ -988,6 +988,8 @@ static __net_init int ipv4_sysctl_init_net(struct net *net)
        if (!net->ipv4.sysctl_local_reserved_ports)
                goto err_ports;
 
+       net->ipv4.sysctl_ip_default_ttl = IPDEFTTL;
+
        return 0;
 
 err_ports: