Commit 78a9cf61 authored by Leonard Crestez's avatar Leonard Crestez Committed by David S. Miller

selftests: nettest: Add --{force,no}-bind-key-ifindex

These options allow explicit control over the TCP_MD5SIG_FLAG_IFINDEX
flag instead of always setting it based on binding to an interface.

Do this by converting to getopt_long because nettest has too many
single-character flags already and getopt_long is widely used in
selftests.
Signed-off-by: default avatarLeonard Crestez <cdleonard@gmail.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a76c2315
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <unistd.h> #include <unistd.h>
#include <time.h> #include <time.h>
#include <errno.h> #include <errno.h>
#include <getopt.h>
#include <linux/xfrm.h> #include <linux/xfrm.h>
#include <linux/ipsec.h> #include <linux/ipsec.h>
...@@ -101,6 +102,8 @@ struct sock_args { ...@@ -101,6 +102,8 @@ struct sock_args {
struct sockaddr_in6 v6; struct sockaddr_in6 v6;
} md5_prefix; } md5_prefix;
unsigned int prefix_len; unsigned int prefix_len;
/* 0: default, -1: force off, +1: force on */
int bind_key_ifindex;
/* expected addresses and device index for connection */ /* expected addresses and device index for connection */
const char *expected_dev; const char *expected_dev;
...@@ -271,11 +274,14 @@ static int tcp_md5sig(int sd, void *addr, socklen_t alen, struct sock_args *args ...@@ -271,11 +274,14 @@ static int tcp_md5sig(int sd, void *addr, socklen_t alen, struct sock_args *args
} }
memcpy(&md5sig.tcpm_addr, addr, alen); memcpy(&md5sig.tcpm_addr, addr, alen);
if (args->ifindex) { if ((args->ifindex && args->bind_key_ifindex >= 0) || args->bind_key_ifindex >= 1) {
opt = TCP_MD5SIG_EXT; opt = TCP_MD5SIG_EXT;
md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX; md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX;
md5sig.tcpm_ifindex = args->ifindex; md5sig.tcpm_ifindex = args->ifindex;
log_msg("TCP_MD5SIG_FLAG_IFINDEX set tcpm_ifindex=%d\n", md5sig.tcpm_ifindex);
} else {
log_msg("TCP_MD5SIG_FLAG_IFINDEX off\n", md5sig.tcpm_ifindex);
} }
rc = setsockopt(sd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig)); rc = setsockopt(sd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig));
...@@ -1822,6 +1828,14 @@ static int ipc_parent(int cpid, int fd, struct sock_args *args) ...@@ -1822,6 +1828,14 @@ static int ipc_parent(int cpid, int fd, struct sock_args *args)
} }
#define GETOPT_STR "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SCi6xL:0:1:2:3:Fbq" #define GETOPT_STR "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SCi6xL:0:1:2:3:Fbq"
#define OPT_FORCE_BIND_KEY_IFINDEX 1001
#define OPT_NO_BIND_KEY_IFINDEX 1002
static struct option long_opts[] = {
{"force-bind-key-ifindex", 0, 0, OPT_FORCE_BIND_KEY_IFINDEX},
{"no-bind-key-ifindex", 0, 0, OPT_NO_BIND_KEY_IFINDEX},
{0, 0, 0, 0}
};
static void print_usage(char *prog) static void print_usage(char *prog)
{ {
...@@ -1858,6 +1872,10 @@ static void print_usage(char *prog) ...@@ -1858,6 +1872,10 @@ static void print_usage(char *prog)
" -M password use MD5 sum protection\n" " -M password use MD5 sum protection\n"
" -X password MD5 password for client mode\n" " -X password MD5 password for client mode\n"
" -m prefix/len prefix and length to use for MD5 key\n" " -m prefix/len prefix and length to use for MD5 key\n"
" --no-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX off\n"
" --force-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX on\n"
" (default: only if -I is passed)\n"
"\n"
" -g grp multicast group (e.g., 239.1.1.1)\n" " -g grp multicast group (e.g., 239.1.1.1)\n"
" -i interactive mode (default is echo and terminate)\n" " -i interactive mode (default is echo and terminate)\n"
"\n" "\n"
...@@ -1893,7 +1911,7 @@ int main(int argc, char *argv[]) ...@@ -1893,7 +1911,7 @@ int main(int argc, char *argv[])
* process input args * process input args
*/ */
while ((rc = getopt(argc, argv, GETOPT_STR)) != -1) { while ((rc = getopt_long(argc, argv, GETOPT_STR, long_opts, NULL)) != -1) {
switch (rc) { switch (rc) {
case 'B': case 'B':
both_mode = 1; both_mode = 1;
...@@ -1966,6 +1984,12 @@ int main(int argc, char *argv[]) ...@@ -1966,6 +1984,12 @@ int main(int argc, char *argv[])
case 'M': case 'M':
args.password = optarg; args.password = optarg;
break; break;
case OPT_FORCE_BIND_KEY_IFINDEX:
args.bind_key_ifindex = 1;
break;
case OPT_NO_BIND_KEY_IFINDEX:
args.bind_key_ifindex = -1;
break;
case 'X': case 'X':
args.client_pw = optarg; args.client_pw = optarg;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment