From: Geliang Tang <tanggeliang@kylinos.cn>
Add socket option handling for TCP_MD5SIG and TCP_MD5SIG_EXT.
Configure MD5 keys using the key provided via '-m' parameter.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
.../selftests/net/mptcp/mptcp_sockopt.c | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
index fcf1d7a195d1..e577fbec9373 100644
--- a/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
+++ b/tools/testing/selftests/net/mptcp/mptcp_sockopt.c
@@ -25,6 +25,7 @@
#include <netinet/in.h>
#include <linux/tcp.h>
+#include <arpa/inet.h>
static int pf = AF_INET;
static bool md5;
@@ -186,6 +187,50 @@ static void xgetaddrinfo(const char *node, const char *service,
}
}
+static void do_setsockopt_md5sig(int fd)
+{
+ struct sockaddr_storage *addr;
+ size_t key_len = strlen(key);
+ struct tcp_md5sig md5sig;
+ int opt = TCP_MD5SIG;
+
+ memset(&md5sig, 0, sizeof(md5sig));
+ addr = (struct sockaddr_storage *)&md5sig.tcpm_addr;
+ addr->ss_family = pf;
+
+ if ((pf == AF_INET ? inet_pton(pf, "127.0.0.1", &((struct sockaddr_in *)addr)->sin_addr) :
+ inet_pton(pf, "::1", &((struct sockaddr_in6 *)addr)->sin6_addr)) != 1)
+ perror("inet_pton failed");
+
+ if (key_len > sizeof(md5sig.tcpm_key))
+ perror("Key too long\n");
+
+ memcpy(md5sig.tcpm_key, key, key_len);
+ md5sig.tcpm_keylen = key_len;
+
+ if (prefixlen || ifindex)
+ opt = TCP_MD5SIG_EXT;
+
+ if (prefixlen) {
+ md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_PREFIX;
+ md5sig.tcpm_prefixlen = prefixlen;
+ }
+
+ if (ifindex) {
+ md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX;
+ md5sig.tcpm_ifindex = (uint8_t)ifindex;
+ }
+
+ if (setsockopt(fd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig)))
+ perror("setsockopt(TCP_MD5SIG)");
+}
+
+static void do_setsockopts(int fd)
+{
+ if (md5)
+ do_setsockopt_md5sig(fd);
+}
+
static int sock_listen_mptcp(const char * const listenaddr,
const char * const port)
{
@@ -213,6 +258,8 @@ static int sock_listen_mptcp(const char * const listenaddr,
sizeof(one)))
perror("setsockopt");
+ do_setsockopts(sock);
+
if (bind(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
@@ -250,6 +297,8 @@ static int sock_connect_mptcp(const char * const remoteaddr,
if (sock < 0)
continue;
+ do_setsockopts(sock);
+
if (connect(sock, a->ai_addr, a->ai_addrlen) == 0)
break; /* success */
--
2.43.0