OSDN Git Service

mptcp: unify ADD_ADDR and ADD_ADDR6 suboptions writing
authorGeliang Tang <geliangtang@gmail.com>
Wed, 9 Dec 2020 23:51:19 +0000 (15:51 -0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Dec 2020 03:02:15 +0000 (19:02 -0800)
The length of ADD_ADDR6 is 12 octets longer than ADD_ADDR. That's the
only difference between them.

This patch dropped the duplicate code between ADD_ADDR and ADD_ADDR6
suboptions writing, and unify them into one.

Signed-off-by: Geliang Tang <geliangtang@gmail.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c

index c0cf0f5..ab86f89 100644 (file)
@@ -1070,10 +1070,19 @@ void mptcp_write_options(__be32 *ptr, const struct tcp_sock *tp,
        }
 
 mp_capable_done:
-       if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) {
+       if ((OPTION_MPTCP_ADD_ADDR
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+            | OPTION_MPTCP_ADD_ADDR6
+#endif
+           ) & opts->suboptions) {
                u8 len = TCPOLEN_MPTCP_ADD_ADDR_BASE;
                u8 echo = MPTCP_ADDR_ECHO;
 
+#if IS_ENABLED(CONFIG_MPTCP_IPV6)
+               if (OPTION_MPTCP_ADD_ADDR6 & opts->suboptions)
+                       len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
+#endif
+
                if (opts->ahmac) {
                        len += sizeof(opts->ahmac);
                        echo = 0;
@@ -1081,33 +1090,21 @@ mp_capable_done:
 
                *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
                                      len, echo, opts->addr_id);
-               memcpy((u8 *)ptr, (u8 *)&opts->addr.s_addr, 4);
-               ptr += 1;
-               if (opts->ahmac) {
-                       put_unaligned_be64(opts->ahmac, ptr);
-                       ptr += 2;
+               if (OPTION_MPTCP_ADD_ADDR & opts->suboptions) {
+                       memcpy((u8 *)ptr, (u8 *)&opts->addr.s_addr, 4);
+                       ptr += 1;
                }
-       }
-
 #if IS_ENABLED(CONFIG_MPTCP_IPV6)
-       if (OPTION_MPTCP_ADD_ADDR6 & opts->suboptions) {
-               u8 len = TCPOLEN_MPTCP_ADD_ADDR6_BASE;
-               u8 echo = MPTCP_ADDR_ECHO;
-
-               if (opts->ahmac) {
-                       len += sizeof(opts->ahmac);
-                       echo = 0;
+               else if (OPTION_MPTCP_ADD_ADDR6 & opts->suboptions) {
+                       memcpy((u8 *)ptr, opts->addr6.s6_addr, 16);
+                       ptr += 4;
                }
-               *ptr++ = mptcp_option(MPTCPOPT_ADD_ADDR,
-                                     len, echo, opts->addr_id);
-               memcpy((u8 *)ptr, opts->addr6.s6_addr, 16);
-               ptr += 4;
+#endif
                if (opts->ahmac) {
                        put_unaligned_be64(opts->ahmac, ptr);
                        ptr += 2;
                }
        }
-#endif
 
        if (OPTION_MPTCP_RM_ADDR & opts->suboptions) {
                *ptr++ = mptcp_option(MPTCPOPT_RM_ADDR,