mirror of
https://github.com/torvalds/linux
synced 2024-10-19 01:39:28 +00:00
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 <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 {
|
||||||
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
|
||||||
}
|
}
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
#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)
|
||||||
" -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[])
|
||||||
* 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[])
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue