ipv4: rename ip_options_echo to __ip_options_echo()
authorEric Dumazet <edumazet@google.com>
Sat, 27 Sep 2014 16:50:55 +0000 (09:50 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 28 Sep 2014 20:35:42 +0000 (16:35 -0400)
ip_options_echo() assumes struct ip_options is provided in &IPCB(skb)->opt
Lets break this assumption, but provide a helper to not change all call points.

ip_send_unicast_reply() gets a new struct ip_options pointer.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip.h
net/ipv4/ip_options.c
net/ipv4/ip_output.c
net/ipv4/tcp_ipv4.c

index fcd9068fb8c343e0ab8012d57dcd508033499dd4..0bb620702929e7ad3b48f7aa40e5c73df3638141 100644 (file)
@@ -180,8 +180,10 @@ static inline __u8 ip_reply_arg_flowi_flags(const struct ip_reply_arg *arg)
        return (arg->flags & IP_REPLY_ARG_NOSRCCHECK) ? FLOWI_FLAG_ANYSRC : 0;
 }
 
-void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
-                          __be32 saddr, const struct ip_reply_arg *arg,
+void ip_send_unicast_reply(struct net *net, struct sk_buff *skb,
+                          const struct ip_options *sopt,
+                          __be32 daddr, __be32 saddr,
+                          const struct ip_reply_arg *arg,
                           unsigned int len);
 
 #define IP_INC_STATS(net, field)       SNMP_INC_STATS64((net)->mib.ip_statistics, field)
@@ -511,7 +513,14 @@ int ip_forward(struct sk_buff *skb);
  
 void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
                      __be32 daddr, struct rtable *rt, int is_frag);
-int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb);
+
+int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
+                     const struct ip_options *sopt);
+static inline int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb)
+{
+       return __ip_options_echo(dopt, skb, &IPCB(skb)->opt);
+}
+
 void ip_options_fragment(struct sk_buff *skb);
 int ip_options_compile(struct net *net, struct ip_options *opt,
                       struct sk_buff *skb);
index ad382499bace4ce3852c2953bb262f2796d9a416..5b3d91be2db0c8f1a78606727c703475dd61b598 100644 (file)
@@ -87,17 +87,15 @@ void ip_options_build(struct sk_buff *skb, struct ip_options *opt,
  * NOTE: dopt cannot point to skb.
  */
 
-int ip_options_echo(struct ip_options *dopt, struct sk_buff *skb)
+int __ip_options_echo(struct ip_options *dopt, struct sk_buff *skb,
+                     const struct ip_options *sopt)
 {
-       const struct ip_options *sopt;
        unsigned char *sptr, *dptr;
        int soffset, doffset;
        int     optlen;
 
        memset(dopt, 0, sizeof(struct ip_options));
 
-       sopt = &(IPCB(skb)->opt);
-
        if (sopt->optlen == 0)
                return 0;
 
index 215af2b155cb1946ff5f4b4d7d0fff19291573b8..c8fa62476461fc87d49f15f0def7ba385c306c0c 100644 (file)
@@ -1522,8 +1522,10 @@ static DEFINE_PER_CPU(struct inet_sock, unicast_sock) = {
        .uc_ttl         = -1,
 };
 
-void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
-                          __be32 saddr, const struct ip_reply_arg *arg,
+void ip_send_unicast_reply(struct net *net, struct sk_buff *skb,
+                          const struct ip_options *sopt,
+                          __be32 daddr, __be32 saddr,
+                          const struct ip_reply_arg *arg,
                           unsigned int len)
 {
        struct ip_options_data replyopts;
@@ -1534,7 +1536,7 @@ void ip_send_unicast_reply(struct net *net, struct sk_buff *skb, __be32 daddr,
        struct sock *sk;
        struct inet_sock *inet;
 
-       if (ip_options_echo(&replyopts.opt.opt, skb))
+       if (__ip_options_echo(&replyopts.opt.opt, skb, sopt))
                return;
 
        ipc.addr = daddr;
index 3b2e49cb2b61ffcef110cde31fce6d62242f8fdb..28ab90382c0130babe6b9b4c4b28bf2f46c0bc86 100644 (file)
@@ -681,8 +681,9 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb)
 
        net = dev_net(skb_dst(skb)->dev);
        arg.tos = ip_hdr(skb)->tos;
-       ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
-                             ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
+       ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt,
+                             ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
+                             &arg, arg.iov[0].iov_len);
 
        TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
        TCP_INC_STATS_BH(net, TCP_MIB_OUTRSTS);
@@ -764,8 +765,9 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,
        if (oif)
                arg.bound_dev_if = oif;
        arg.tos = tos;
-       ip_send_unicast_reply(net, skb, ip_hdr(skb)->saddr,
-                             ip_hdr(skb)->daddr, &arg, arg.iov[0].iov_len);
+       ip_send_unicast_reply(net, skb, &TCP_SKB_CB(skb)->header.h4.opt,
+                             ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
+                             &arg, arg.iov[0].iov_len);
 
        TCP_INC_STATS_BH(net, TCP_MIB_OUTSEGS);
 }