[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1514136201-111109-1-git-send-email-sowmini.varadhan@oracle.com>
Date: Sun, 24 Dec 2017 09:23:21 -0800
From: Sowmini Varadhan <sowmini.varadhan@...cle.com>
To: sowmini.varadhan@...cle.com
Subject: [PATCH net-next] selftests/net: fix bugs in cfg_port initialization
If -S is not used in the command line, we should
be binding to *.<cfg-port>. Similarly, cfg_port should be
used to connect to the remote host even if it is processed
after -D. Thus we need to make sure that the cfg_port in
cfg_src_addr and cfg_dst_addr are always initialized
after all other command line options are parsed.
Store cfg_port in host-byte order, and use htons()
to set up the sin_port/sin6_port before bind/connect,
so that the network system calls get the correct values
in network-byte order.
Signed-off-by: Sowmini Varadhan <sowmini.varadhan@...cle.com>
---
tools/testing/selftests/net/msg_zerocopy.c | 25 ++++++++++++++++++++++++-
1 files changed, 24 insertions(+), 1 deletions(-)
diff --git a/tools/testing/selftests/net/msg_zerocopy.c b/tools/testing/selftests/net/msg_zerocopy.c
index 3ab6ec4..561fff7 100644
--- a/tools/testing/selftests/net/msg_zerocopy.c
+++ b/tools/testing/selftests/net/msg_zerocopy.c
@@ -259,6 +259,27 @@ static int setup_ip6h(struct ipv6hdr *ip6h, uint16_t payload_len)
return sizeof(*ip6h);
}
+static void init_sockaddr_port(sa_family_t af,
+ struct sockaddr_storage *sockaddr)
+{
+ struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) sockaddr;
+ struct sockaddr_in *addr4 = (struct sockaddr_in *) sockaddr;
+
+ switch (af) {
+ case PF_INET:
+ addr4->sin_family = PF_INET;
+ addr4->sin_port = htons(cfg_port);
+ break;
+ case PF_INET6:
+ addr4->sin_family = PF_INET6;
+ addr6->sin6_port = htons(cfg_port);
+ break;
+ default:
+ error(1, 0, "illegal domain");
+ break;
+ }
+}
+
static void setup_sockaddr(int domain, const char *str_addr, void *sockaddr)
{
struct sockaddr_in6 *addr6 = (void *) sockaddr;
@@ -638,7 +659,7 @@ static void parse_opts(int argc, char **argv)
cfg_cork_mixed = true;
break;
case 'p':
- cfg_port = htons(strtoul(optarg, NULL, 0));
+ cfg_port = strtoul(optarg, NULL, 0);
break;
case 'r':
cfg_rx = true;
@@ -660,6 +681,8 @@ static void parse_opts(int argc, char **argv)
break;
}
}
+ init_sockaddr_port(cfg_family, &cfg_dst_addr);
+ init_sockaddr_port(cfg_family, &cfg_src_addr);
if (cfg_payload_len > max_payload_len)
error(1, 0, "-s: payload exceeds max (%d)", max_payload_len);
--
1.7.1
Powered by blists - more mailing lists