forked from Minki/linux
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: Leonard Crestez <cdleonard@gmail.com> Reviewed-by: David Ahern <dsahern@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a76c2315be
commit
78a9cf6143
@ -28,6 +28,7 @@
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#include <linux/xfrm.h>
|
||||
#include <linux/ipsec.h>
|
||||
@ -101,6 +102,8 @@ struct sock_args {
|
||||
struct sockaddr_in6 v6;
|
||||
} md5_prefix;
|
||||
unsigned int prefix_len;
|
||||
/* 0: default, -1: force off, +1: force on */
|
||||
int bind_key_ifindex;
|
||||
|
||||
/* expected addresses and device index for connection */
|
||||
const char *expected_dev;
|
||||
@ -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);
|
||||
|
||||
if (args->ifindex) {
|
||||
if ((args->ifindex && args->bind_key_ifindex >= 0) || args->bind_key_ifindex >= 1) {
|
||||
opt = TCP_MD5SIG_EXT;
|
||||
md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_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));
|
||||
@ -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 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)
|
||||
{
|
||||
@ -1858,6 +1872,10 @@ static void print_usage(char *prog)
|
||||
" -M password use MD5 sum protection\n"
|
||||
" -X password MD5 password for client mode\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"
|
||||
" -i interactive mode (default is echo and terminate)\n"
|
||||
"\n"
|
||||
@ -1893,7 +1911,7 @@ int main(int argc, char *argv[])
|
||||
* 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) {
|
||||
case 'B':
|
||||
both_mode = 1;
|
||||
@ -1966,6 +1984,12 @@ int main(int argc, char *argv[])
|
||||
case 'M':
|
||||
args.password = optarg;
|
||||
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':
|
||||
args.client_pw = optarg;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user