linux/tools/testing/selftests/net/nettest.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* nettest - used for functional tests of networking APIs
   3 *
   4 * Copyright (c) 2013-2019 David Ahern <dsahern@gmail.com>. All rights reserved.
   5 */
   6
   7#define _GNU_SOURCE
   8#include <features.h>
   9#include <sys/types.h>
  10#include <sys/ioctl.h>
  11#include <sys/socket.h>
  12#include <sys/wait.h>
  13#include <linux/tcp.h>
  14#include <linux/udp.h>
  15#include <arpa/inet.h>
  16#include <net/if.h>
  17#include <netinet/in.h>
  18#include <netinet/ip.h>
  19#include <netdb.h>
  20#include <fcntl.h>
  21#include <libgen.h>
  22#include <limits.h>
  23#include <sched.h>
  24#include <stdarg.h>
  25#include <stdio.h>
  26#include <stdlib.h>
  27#include <string.h>
  28#include <unistd.h>
  29#include <time.h>
  30#include <errno.h>
  31#include <getopt.h>
  32
  33#include <linux/xfrm.h>
  34#include <linux/ipsec.h>
  35#include <linux/pfkeyv2.h>
  36
  37#ifndef IPV6_UNICAST_IF
  38#define IPV6_UNICAST_IF         76
  39#endif
  40#ifndef IPV6_MULTICAST_IF
  41#define IPV6_MULTICAST_IF       17
  42#endif
  43
  44#define DEFAULT_PORT 12345
  45
  46#define NS_PREFIX "/run/netns/"
  47
  48#ifndef MAX
  49#define MAX(a, b)  ((a) > (b) ? (a) : (b))
  50#endif
  51#ifndef MIN
  52#define MIN(a, b)  ((a) < (b) ? (a) : (b))
  53#endif
  54
  55struct sock_args {
  56        /* local address */
  57        const char *local_addr_str;
  58        const char *client_local_addr_str;
  59        union {
  60                struct in_addr  in;
  61                struct in6_addr in6;
  62        } local_addr;
  63
  64        /* remote address */
  65        const char *remote_addr_str;
  66        union {
  67                struct in_addr  in;
  68                struct in6_addr in6;
  69        } remote_addr;
  70        int scope_id;  /* remote scope; v6 send only */
  71
  72        struct in_addr grp;     /* multicast group */
  73
  74        unsigned int has_local_ip:1,
  75                     has_remote_ip:1,
  76                     has_grp:1,
  77                     has_expected_laddr:1,
  78                     has_expected_raddr:1,
  79                     bind_test_only:1;
  80
  81        unsigned short port;
  82
  83        int type;      /* DGRAM, STREAM, RAW */
  84        int protocol;
  85        int version;   /* AF_INET/AF_INET6 */
  86
  87        int use_setsockopt;
  88        int use_freebind;
  89        int use_cmsg;
  90        const char *dev;
  91        const char *server_dev;
  92        int ifindex;
  93
  94        const char *clientns;
  95        const char *serverns;
  96
  97        const char *password;
  98        const char *client_pw;
  99        /* prefix for MD5 password */
 100        const char *md5_prefix_str;
 101        union {
 102                struct sockaddr_in v4;
 103                struct sockaddr_in6 v6;
 104        } md5_prefix;
 105        unsigned int prefix_len;
 106        /* 0: default, -1: force off, +1: force on */
 107        int bind_key_ifindex;
 108
 109        /* expected addresses and device index for connection */
 110        const char *expected_dev;
 111        const char *expected_server_dev;
 112        int expected_ifindex;
 113
 114        /* local address */
 115        const char *expected_laddr_str;
 116        union {
 117                struct in_addr  in;
 118                struct in6_addr in6;
 119        } expected_laddr;
 120
 121        /* remote address */
 122        const char *expected_raddr_str;
 123        union {
 124                struct in_addr  in;
 125                struct in6_addr in6;
 126        } expected_raddr;
 127
 128        /* ESP in UDP encap test */
 129        int use_xfrm;
 130};
 131
 132static int server_mode;
 133static unsigned int prog_timeout = 5;
 134static unsigned int interactive;
 135static int iter = 1;
 136static char *msg = "Hello world!";
 137static int msglen;
 138static int quiet;
 139static int try_broadcast = 1;
 140
 141static char *timestamp(char *timebuf, int buflen)
 142{
 143        time_t now;
 144
 145        now = time(NULL);
 146        if (strftime(timebuf, buflen, "%T", localtime(&now)) == 0) {
 147                memset(timebuf, 0, buflen);
 148                strncpy(timebuf, "00:00:00", buflen-1);
 149        }
 150
 151        return timebuf;
 152}
 153
 154static void log_msg(const char *format, ...)
 155{
 156        char timebuf[64];
 157        va_list args;
 158
 159        if (quiet)
 160                return;
 161
 162        fprintf(stdout, "%s %s:",
 163                timestamp(timebuf, sizeof(timebuf)),
 164                server_mode ? "server" : "client");
 165        va_start(args, format);
 166        vfprintf(stdout, format, args);
 167        va_end(args);
 168
 169        fflush(stdout);
 170}
 171
 172static void log_error(const char *format, ...)
 173{
 174        char timebuf[64];
 175        va_list args;
 176
 177        if (quiet)
 178                return;
 179
 180        fprintf(stderr, "%s %s:",
 181                timestamp(timebuf, sizeof(timebuf)),
 182                server_mode ? "server" : "client");
 183        va_start(args, format);
 184        vfprintf(stderr, format, args);
 185        va_end(args);
 186
 187        fflush(stderr);
 188}
 189
 190static void log_err_errno(const char *fmt, ...)
 191{
 192        char timebuf[64];
 193        va_list args;
 194
 195        if (quiet)
 196                return;
 197
 198        fprintf(stderr, "%s %s: ",
 199                timestamp(timebuf, sizeof(timebuf)),
 200                server_mode ? "server" : "client");
 201        va_start(args, fmt);
 202        vfprintf(stderr, fmt, args);
 203        va_end(args);
 204
 205        fprintf(stderr, ": %d: %s\n", errno, strerror(errno));
 206        fflush(stderr);
 207}
 208
 209static void log_address(const char *desc, struct sockaddr *sa)
 210{
 211        char addrstr[64];
 212
 213        if (quiet)
 214                return;
 215
 216        if (sa->sa_family == AF_INET) {
 217                struct sockaddr_in *s = (struct sockaddr_in *) sa;
 218
 219                log_msg("%s %s:%d\n",
 220                        desc,
 221                        inet_ntop(AF_INET, &s->sin_addr, addrstr,
 222                                  sizeof(addrstr)),
 223                        ntohs(s->sin_port));
 224
 225        } else if (sa->sa_family == AF_INET6) {
 226                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
 227
 228                log_msg("%s [%s]:%d\n",
 229                        desc,
 230                        inet_ntop(AF_INET6, &s6->sin6_addr, addrstr,
 231                                  sizeof(addrstr)),
 232                        ntohs(s6->sin6_port));
 233        }
 234
 235        fflush(stdout);
 236}
 237
 238static int switch_ns(const char *ns)
 239{
 240        char path[PATH_MAX];
 241        int fd, ret;
 242
 243        if (geteuid())
 244                log_error("warning: likely need root to set netns %s!\n", ns);
 245
 246        snprintf(path, sizeof(path), "%s%s", NS_PREFIX, ns);
 247        fd = open(path, 0);
 248        if (fd < 0) {
 249                log_err_errno("Failed to open netns path; can not switch netns");
 250                return 1;
 251        }
 252
 253        ret = setns(fd, CLONE_NEWNET);
 254        close(fd);
 255
 256        return ret;
 257}
 258
 259static int tcp_md5sig(int sd, void *addr, socklen_t alen, struct sock_args *args)
 260{
 261        int keylen = strlen(args->password);
 262        struct tcp_md5sig md5sig = {};
 263        int opt = TCP_MD5SIG;
 264        int rc;
 265
 266        md5sig.tcpm_keylen = keylen;
 267        memcpy(md5sig.tcpm_key, args->password, keylen);
 268
 269        if (args->prefix_len) {
 270                opt = TCP_MD5SIG_EXT;
 271                md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_PREFIX;
 272
 273                md5sig.tcpm_prefixlen = args->prefix_len;
 274                addr = &args->md5_prefix;
 275        }
 276        memcpy(&md5sig.tcpm_addr, addr, alen);
 277
 278        if ((args->ifindex && args->bind_key_ifindex >= 0) || args->bind_key_ifindex >= 1) {
 279                opt = TCP_MD5SIG_EXT;
 280                md5sig.tcpm_flags |= TCP_MD5SIG_FLAG_IFINDEX;
 281
 282                md5sig.tcpm_ifindex = args->ifindex;
 283                log_msg("TCP_MD5SIG_FLAG_IFINDEX set tcpm_ifindex=%d\n", md5sig.tcpm_ifindex);
 284        } else {
 285                log_msg("TCP_MD5SIG_FLAG_IFINDEX off\n", md5sig.tcpm_ifindex);
 286        }
 287
 288        rc = setsockopt(sd, IPPROTO_TCP, opt, &md5sig, sizeof(md5sig));
 289        if (rc < 0) {
 290                /* ENOENT is harmless. Returned when a password is cleared */
 291                if (errno == ENOENT)
 292                        rc = 0;
 293                else
 294                        log_err_errno("setsockopt(TCP_MD5SIG)");
 295        }
 296
 297        return rc;
 298}
 299
 300static int tcp_md5_remote(int sd, struct sock_args *args)
 301{
 302        struct sockaddr_in sin = {
 303                .sin_family = AF_INET,
 304        };
 305        struct sockaddr_in6 sin6 = {
 306                .sin6_family = AF_INET6,
 307        };
 308        void *addr;
 309        int alen;
 310
 311        switch (args->version) {
 312        case AF_INET:
 313                sin.sin_port = htons(args->port);
 314                sin.sin_addr = args->md5_prefix.v4.sin_addr;
 315                addr = &sin;
 316                alen = sizeof(sin);
 317                break;
 318        case AF_INET6:
 319                sin6.sin6_port = htons(args->port);
 320                sin6.sin6_addr = args->md5_prefix.v6.sin6_addr;
 321                addr = &sin6;
 322                alen = sizeof(sin6);
 323                break;
 324        default:
 325                log_error("unknown address family\n");
 326                exit(1);
 327        }
 328
 329        if (tcp_md5sig(sd, addr, alen, args))
 330                return -1;
 331
 332        return 0;
 333}
 334
 335static int get_ifidx(const char *ifname)
 336{
 337        struct ifreq ifdata;
 338        int sd, rc;
 339
 340        if (!ifname || *ifname == '\0')
 341                return -1;
 342
 343        memset(&ifdata, 0, sizeof(ifdata));
 344
 345        strcpy(ifdata.ifr_name, ifname);
 346
 347        sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
 348        if (sd < 0) {
 349                log_err_errno("socket failed");
 350                return -1;
 351        }
 352
 353        rc = ioctl(sd, SIOCGIFINDEX, (char *)&ifdata);
 354        close(sd);
 355        if (rc != 0) {
 356                log_err_errno("ioctl(SIOCGIFINDEX) failed");
 357                return -1;
 358        }
 359
 360        return ifdata.ifr_ifindex;
 361}
 362
 363static int bind_to_device(int sd, const char *name)
 364{
 365        int rc;
 366
 367        rc = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, name, strlen(name)+1);
 368        if (rc < 0)
 369                log_err_errno("setsockopt(SO_BINDTODEVICE)");
 370
 371        return rc;
 372}
 373
 374static int get_bind_to_device(int sd, char *name, size_t len)
 375{
 376        int rc;
 377        socklen_t optlen = len;
 378
 379        name[0] = '\0';
 380        rc = getsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, name, &optlen);
 381        if (rc < 0)
 382                log_err_errno("setsockopt(SO_BINDTODEVICE)");
 383
 384        return rc;
 385}
 386
 387static int check_device(int sd, struct sock_args *args)
 388{
 389        int ifindex = 0;
 390        char name[32];
 391
 392        if (get_bind_to_device(sd, name, sizeof(name)))
 393                *name = '\0';
 394        else
 395                ifindex = get_ifidx(name);
 396
 397        log_msg("    bound to device %s/%d\n",
 398                *name ? name : "<none>", ifindex);
 399
 400        if (!args->expected_ifindex)
 401                return 0;
 402
 403        if (args->expected_ifindex != ifindex) {
 404                log_error("Device index mismatch: expected %d have %d\n",
 405                          args->expected_ifindex, ifindex);
 406                return 1;
 407        }
 408
 409        log_msg("Device index matches: expected %d have %d\n",
 410                args->expected_ifindex, ifindex);
 411
 412        return 0;
 413}
 414
 415static int set_pktinfo_v4(int sd)
 416{
 417        int one = 1;
 418        int rc;
 419
 420        rc = setsockopt(sd, SOL_IP, IP_PKTINFO, &one, sizeof(one));
 421        if (rc < 0 && rc != -ENOTSUP)
 422                log_err_errno("setsockopt(IP_PKTINFO)");
 423
 424        return rc;
 425}
 426
 427static int set_recvpktinfo_v6(int sd)
 428{
 429        int one = 1;
 430        int rc;
 431
 432        rc = setsockopt(sd, SOL_IPV6, IPV6_RECVPKTINFO, &one, sizeof(one));
 433        if (rc < 0 && rc != -ENOTSUP)
 434                log_err_errno("setsockopt(IPV6_RECVPKTINFO)");
 435
 436        return rc;
 437}
 438
 439static int set_recverr_v4(int sd)
 440{
 441        int one = 1;
 442        int rc;
 443
 444        rc = setsockopt(sd, SOL_IP, IP_RECVERR, &one, sizeof(one));
 445        if (rc < 0 && rc != -ENOTSUP)
 446                log_err_errno("setsockopt(IP_RECVERR)");
 447
 448        return rc;
 449}
 450
 451static int set_recverr_v6(int sd)
 452{
 453        int one = 1;
 454        int rc;
 455
 456        rc = setsockopt(sd, SOL_IPV6, IPV6_RECVERR, &one, sizeof(one));
 457        if (rc < 0 && rc != -ENOTSUP)
 458                log_err_errno("setsockopt(IPV6_RECVERR)");
 459
 460        return rc;
 461}
 462
 463static int set_unicast_if(int sd, int ifindex, int version)
 464{
 465        int opt = IP_UNICAST_IF;
 466        int level = SOL_IP;
 467        int rc;
 468
 469        ifindex = htonl(ifindex);
 470
 471        if (version == AF_INET6) {
 472                opt = IPV6_UNICAST_IF;
 473                level = SOL_IPV6;
 474        }
 475        rc = setsockopt(sd, level, opt, &ifindex, sizeof(ifindex));
 476        if (rc < 0)
 477                log_err_errno("setsockopt(IP_UNICAST_IF)");
 478
 479        return rc;
 480}
 481
 482static int set_multicast_if(int sd, int ifindex)
 483{
 484        struct ip_mreqn mreq = { .imr_ifindex = ifindex };
 485        int rc;
 486
 487        rc = setsockopt(sd, SOL_IP, IP_MULTICAST_IF, &mreq, sizeof(mreq));
 488        if (rc < 0)
 489                log_err_errno("setsockopt(IP_MULTICAST_IF)");
 490
 491        return rc;
 492}
 493
 494static int set_membership(int sd, uint32_t grp, uint32_t addr, int ifindex)
 495{
 496        uint32_t if_addr = addr;
 497        struct ip_mreqn mreq;
 498        int rc;
 499
 500        if (addr == htonl(INADDR_ANY) && !ifindex) {
 501                log_error("Either local address or device needs to be given for multicast membership\n");
 502                return -1;
 503        }
 504
 505        mreq.imr_multiaddr.s_addr = grp;
 506        mreq.imr_address.s_addr = if_addr;
 507        mreq.imr_ifindex = ifindex;
 508
 509        rc = setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
 510        if (rc < 0) {
 511                log_err_errno("setsockopt(IP_ADD_MEMBERSHIP)");
 512                return -1;
 513        }
 514
 515        return 0;
 516}
 517
 518static int set_freebind(int sd, int version)
 519{
 520        unsigned int one = 1;
 521        int rc = 0;
 522
 523        switch (version) {
 524        case AF_INET:
 525                if (setsockopt(sd, SOL_IP, IP_FREEBIND, &one, sizeof(one))) {
 526                        log_err_errno("setsockopt(IP_FREEBIND)");
 527                        rc = -1;
 528                }
 529                break;
 530        case AF_INET6:
 531                if (setsockopt(sd, SOL_IPV6, IPV6_FREEBIND, &one, sizeof(one))) {
 532                        log_err_errno("setsockopt(IPV6_FREEBIND");
 533                        rc = -1;
 534                }
 535                break;
 536        }
 537
 538        return rc;
 539}
 540
 541static int set_broadcast(int sd)
 542{
 543        unsigned int one = 1;
 544        int rc = 0;
 545
 546        if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &one, sizeof(one)) != 0) {
 547                log_err_errno("setsockopt(SO_BROADCAST)");
 548                rc = -1;
 549        }
 550
 551        return rc;
 552}
 553
 554static int set_reuseport(int sd)
 555{
 556        unsigned int one = 1;
 557        int rc = 0;
 558
 559        if (setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, &one, sizeof(one)) != 0) {
 560                log_err_errno("setsockopt(SO_REUSEPORT)");
 561                rc = -1;
 562        }
 563
 564        return rc;
 565}
 566
 567static int set_reuseaddr(int sd)
 568{
 569        unsigned int one = 1;
 570        int rc = 0;
 571
 572        if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) != 0) {
 573                log_err_errno("setsockopt(SO_REUSEADDR)");
 574                rc = -1;
 575        }
 576
 577        return rc;
 578}
 579
 580static int str_to_uint(const char *str, int min, int max, unsigned int *value)
 581{
 582        int number;
 583        char *end;
 584
 585        errno = 0;
 586        number = (unsigned int) strtoul(str, &end, 0);
 587
 588        /* entire string should be consumed by conversion
 589         * and value should be between min and max
 590         */
 591        if (((*end == '\0') || (*end == '\n')) && (end != str) &&
 592            (errno != ERANGE) && (min <= number) && (number <= max)) {
 593                *value = number;
 594                return 0;
 595        }
 596
 597        return -1;
 598}
 599
 600static int resolve_devices(struct sock_args *args)
 601{
 602        if (args->dev) {
 603                args->ifindex = get_ifidx(args->dev);
 604                if (args->ifindex < 0) {
 605                        log_error("Invalid device name\n");
 606                        return 1;
 607                }
 608        }
 609
 610        if (args->expected_dev) {
 611                unsigned int tmp;
 612
 613                if (str_to_uint(args->expected_dev, 0, INT_MAX, &tmp) == 0) {
 614                        args->expected_ifindex = (int)tmp;
 615                } else {
 616                        args->expected_ifindex = get_ifidx(args->expected_dev);
 617                        if (args->expected_ifindex < 0) {
 618                                fprintf(stderr, "Invalid expected device\n");
 619                                return 1;
 620                        }
 621                }
 622        }
 623
 624        return 0;
 625}
 626
 627static int expected_addr_match(struct sockaddr *sa, void *expected,
 628                               const char *desc)
 629{
 630        char addrstr[64];
 631        int rc = 0;
 632
 633        if (sa->sa_family == AF_INET) {
 634                struct sockaddr_in *s = (struct sockaddr_in *) sa;
 635                struct in_addr *exp_in = (struct in_addr *) expected;
 636
 637                if (s->sin_addr.s_addr != exp_in->s_addr) {
 638                        log_error("%s address does not match expected %s\n",
 639                                  desc,
 640                                  inet_ntop(AF_INET, exp_in,
 641                                            addrstr, sizeof(addrstr)));
 642                        rc = 1;
 643                }
 644        } else if (sa->sa_family == AF_INET6) {
 645                struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
 646                struct in6_addr *exp_in = (struct in6_addr *) expected;
 647
 648                if (memcmp(&s6->sin6_addr, exp_in, sizeof(*exp_in))) {
 649                        log_error("%s address does not match expected %s\n",
 650                                  desc,
 651                                  inet_ntop(AF_INET6, exp_in,
 652                                            addrstr, sizeof(addrstr)));
 653                        rc = 1;
 654                }
 655        } else {
 656                log_error("%s address does not match expected - unknown family\n",
 657                          desc);
 658                rc = 1;
 659        }
 660
 661        if (!rc)
 662                log_msg("%s address matches expected\n", desc);
 663
 664        return rc;
 665}
 666
 667static int show_sockstat(int sd, struct sock_args *args)
 668{
 669        struct sockaddr_in6 local_addr, remote_addr;
 670        socklen_t alen = sizeof(local_addr);
 671        struct sockaddr *sa;
 672        const char *desc;
 673        int rc = 0;
 674
 675        desc = server_mode ? "server local:" : "client local:";
 676        sa = (struct sockaddr *) &local_addr;
 677        if (getsockname(sd, sa, &alen) == 0) {
 678                log_address(desc, sa);
 679
 680                if (args->has_expected_laddr) {
 681                        rc = expected_addr_match(sa, &args->expected_laddr,
 682                                                 "local");
 683                }
 684        } else {
 685                log_err_errno("getsockname failed");
 686        }
 687
 688        sa = (struct sockaddr *) &remote_addr;
 689        desc = server_mode ? "server peer:" : "client peer:";
 690        if (getpeername(sd, sa, &alen) == 0) {
 691                log_address(desc, sa);
 692
 693                if (args->has_expected_raddr) {
 694                        rc |= expected_addr_match(sa, &args->expected_raddr,
 695                                                 "remote");
 696                }
 697        } else {
 698                log_err_errno("getpeername failed");
 699        }
 700
 701        return rc;
 702}
 703
 704enum addr_type {
 705        ADDR_TYPE_LOCAL,
 706        ADDR_TYPE_REMOTE,
 707        ADDR_TYPE_MCAST,
 708        ADDR_TYPE_EXPECTED_LOCAL,
 709        ADDR_TYPE_EXPECTED_REMOTE,
 710        ADDR_TYPE_MD5_PREFIX,
 711};
 712
 713static int convert_addr(struct sock_args *args, const char *_str,
 714                        enum addr_type atype)
 715{
 716        int pfx_len_max = args->version == AF_INET6 ? 128 : 32;
 717        int family = args->version;
 718        char *str, *dev, *sep;
 719        struct in6_addr *in6;
 720        struct in_addr  *in;
 721        const char *desc;
 722        void *addr;
 723        int rc = 0;
 724
 725        str = strdup(_str);
 726        if (!str)
 727                return -ENOMEM;
 728
 729        switch (atype) {
 730        case ADDR_TYPE_LOCAL:
 731                desc = "local";
 732                addr = &args->local_addr;
 733                break;
 734        case ADDR_TYPE_REMOTE:
 735                desc = "remote";
 736                addr = &args->remote_addr;
 737                break;
 738        case ADDR_TYPE_MCAST:
 739                desc = "mcast grp";
 740                addr = &args->grp;
 741                break;
 742        case ADDR_TYPE_EXPECTED_LOCAL:
 743                desc = "expected local";
 744                addr = &args->expected_laddr;
 745                break;
 746        case ADDR_TYPE_EXPECTED_REMOTE:
 747                desc = "expected remote";
 748                addr = &args->expected_raddr;
 749                break;
 750        case ADDR_TYPE_MD5_PREFIX:
 751                desc = "md5 prefix";
 752                if (family == AF_INET) {
 753                        args->md5_prefix.v4.sin_family = AF_INET;
 754                        addr = &args->md5_prefix.v4.sin_addr;
 755                } else if (family == AF_INET6) {
 756                        args->md5_prefix.v6.sin6_family = AF_INET6;
 757                        addr = &args->md5_prefix.v6.sin6_addr;
 758                } else
 759                        return 1;
 760
 761                sep = strchr(str, '/');
 762                if (sep) {
 763                        *sep = '\0';
 764                        sep++;
 765                        if (str_to_uint(sep, 1, pfx_len_max,
 766                                        &args->prefix_len) != 0) {
 767                                fprintf(stderr, "Invalid port\n");
 768                                return 1;
 769                        }
 770                } else {
 771                        args->prefix_len = 0;
 772                }
 773                break;
 774        default:
 775                log_error("unknown address type\n");
 776                exit(1);
 777        }
 778
 779        switch (family) {
 780        case AF_INET:
 781                in  = (struct in_addr *) addr;
 782                if (str) {
 783                        if (inet_pton(AF_INET, str, in) == 0) {
 784                                log_error("Invalid %s IP address\n", desc);
 785                                rc = -1;
 786                                goto out;
 787                        }
 788                } else {
 789                        in->s_addr = htonl(INADDR_ANY);
 790                }
 791                break;
 792
 793        case AF_INET6:
 794                dev = strchr(str, '%');
 795                if (dev) {
 796                        *dev = '\0';
 797                        dev++;
 798                }
 799
 800                in6 = (struct in6_addr *) addr;
 801                if (str) {
 802                        if (inet_pton(AF_INET6, str, in6) == 0) {
 803                                log_error("Invalid %s IPv6 address\n", desc);
 804                                rc = -1;
 805                                goto out;
 806                        }
 807                } else {
 808                        *in6 = in6addr_any;
 809                }
 810                if (dev) {
 811                        args->scope_id = get_ifidx(dev);
 812                        if (args->scope_id < 0) {
 813                                log_error("Invalid scope on %s IPv6 address\n",
 814                                          desc);
 815                                rc = -1;
 816                                goto out;
 817                        }
 818                }
 819                break;
 820
 821        default:
 822                log_error("Invalid address family\n");
 823        }
 824
 825out:
 826        free(str);
 827        return rc;
 828}
 829
 830static int validate_addresses(struct sock_args *args)
 831{
 832        if (args->local_addr_str &&
 833            convert_addr(args, args->local_addr_str, ADDR_TYPE_LOCAL) < 0)
 834                return 1;
 835
 836        if (args->remote_addr_str &&
 837            convert_addr(args, args->remote_addr_str, ADDR_TYPE_REMOTE) < 0)
 838                return 1;
 839
 840        if (args->md5_prefix_str &&
 841            convert_addr(args, args->md5_prefix_str,
 842                         ADDR_TYPE_MD5_PREFIX) < 0)
 843                return 1;
 844
 845        if (args->expected_laddr_str &&
 846            convert_addr(args, args->expected_laddr_str,
 847                         ADDR_TYPE_EXPECTED_LOCAL))
 848                return 1;
 849
 850        if (args->expected_raddr_str &&
 851            convert_addr(args, args->expected_raddr_str,
 852                         ADDR_TYPE_EXPECTED_REMOTE))
 853                return 1;
 854
 855        return 0;
 856}
 857
 858static int get_index_from_cmsg(struct msghdr *m)
 859{
 860        struct cmsghdr *cm;
 861        int ifindex = 0;
 862        char buf[64];
 863
 864        for (cm = (struct cmsghdr *)CMSG_FIRSTHDR(m);
 865             m->msg_controllen != 0 && cm;
 866             cm = (struct cmsghdr *)CMSG_NXTHDR(m, cm)) {
 867
 868                if (cm->cmsg_level == SOL_IP &&
 869                    cm->cmsg_type == IP_PKTINFO) {
 870                        struct in_pktinfo *pi;
 871
 872                        pi = (struct in_pktinfo *)(CMSG_DATA(cm));
 873                        inet_ntop(AF_INET, &pi->ipi_addr, buf, sizeof(buf));
 874                        ifindex = pi->ipi_ifindex;
 875                } else if (cm->cmsg_level == SOL_IPV6 &&
 876                           cm->cmsg_type == IPV6_PKTINFO) {
 877                        struct in6_pktinfo *pi6;
 878
 879                        pi6 = (struct in6_pktinfo *)(CMSG_DATA(cm));
 880                        inet_ntop(AF_INET6, &pi6->ipi6_addr, buf, sizeof(buf));
 881                        ifindex = pi6->ipi6_ifindex;
 882                }
 883        }
 884
 885        if (ifindex) {
 886                log_msg("    pktinfo: ifindex %d dest addr %s\n",
 887                        ifindex, buf);
 888        }
 889        return ifindex;
 890}
 891
 892static int send_msg_no_cmsg(int sd, void *addr, socklen_t alen)
 893{
 894        int err;
 895
 896again:
 897        err = sendto(sd, msg, msglen, 0, addr, alen);
 898        if (err < 0) {
 899                if (errno == EACCES && try_broadcast) {
 900                        try_broadcast = 0;
 901                        if (!set_broadcast(sd))
 902                                goto again;
 903                        errno = EACCES;
 904                }
 905
 906                log_err_errno("sendto failed");
 907                return 1;
 908        }
 909
 910        return 0;
 911}
 912
 913static int send_msg_cmsg(int sd, void *addr, socklen_t alen,
 914                         int ifindex, int version)
 915{
 916        unsigned char cmsgbuf[64];
 917        struct iovec iov[2];
 918        struct cmsghdr *cm;
 919        struct msghdr m;
 920        int err;
 921
 922        iov[0].iov_base = msg;
 923        iov[0].iov_len = msglen;
 924        m.msg_iov = iov;
 925        m.msg_iovlen = 1;
 926        m.msg_name = (caddr_t)addr;
 927        m.msg_namelen = alen;
 928
 929        memset(cmsgbuf, 0, sizeof(cmsgbuf));
 930        cm = (struct cmsghdr *)cmsgbuf;
 931        m.msg_control = (caddr_t)cm;
 932
 933        if (version == AF_INET) {
 934                struct in_pktinfo *pi;
 935
 936                cm->cmsg_level = SOL_IP;
 937                cm->cmsg_type = IP_PKTINFO;
 938                cm->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
 939                pi = (struct in_pktinfo *)(CMSG_DATA(cm));
 940                pi->ipi_ifindex = ifindex;
 941
 942                m.msg_controllen = cm->cmsg_len;
 943
 944        } else if (version == AF_INET6) {
 945                struct in6_pktinfo *pi6;
 946
 947                cm->cmsg_level = SOL_IPV6;
 948                cm->cmsg_type = IPV6_PKTINFO;
 949                cm->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
 950
 951                pi6 = (struct in6_pktinfo *)(CMSG_DATA(cm));
 952                pi6->ipi6_ifindex = ifindex;
 953
 954                m.msg_controllen = cm->cmsg_len;
 955        }
 956
 957again:
 958        err = sendmsg(sd, &m, 0);
 959        if (err < 0) {
 960                if (errno == EACCES && try_broadcast) {
 961                        try_broadcast = 0;
 962                        if (!set_broadcast(sd))
 963                                goto again;
 964                        errno = EACCES;
 965                }
 966
 967                log_err_errno("sendmsg failed");
 968                return 1;
 969        }
 970
 971        return 0;
 972}
 973
 974
 975static int send_msg(int sd, void *addr, socklen_t alen, struct sock_args *args)
 976{
 977        if (args->type == SOCK_STREAM) {
 978                if (write(sd, msg, msglen) < 0) {
 979                        log_err_errno("write failed sending msg to peer");
 980                        return 1;
 981                }
 982        } else if (args->ifindex && args->use_cmsg) {
 983                if (send_msg_cmsg(sd, addr, alen, args->ifindex, args->version))
 984                        return 1;
 985        } else {
 986                if (send_msg_no_cmsg(sd, addr, alen))
 987                        return 1;
 988        }
 989
 990        log_msg("Sent message:\n");
 991        log_msg("    %.24s%s\n", msg, msglen > 24 ? " ..." : "");
 992
 993        return 0;
 994}
 995
 996static int socket_read_dgram(int sd, struct sock_args *args)
 997{
 998        unsigned char addr[sizeof(struct sockaddr_in6)];
 999        struct sockaddr *sa = (struct sockaddr *) addr;
1000        socklen_t alen = sizeof(addr);
1001        struct iovec iov[2];
1002        struct msghdr m = {
1003                .msg_name = (caddr_t)addr,
1004                .msg_namelen = alen,
1005                .msg_iov = iov,
1006                .msg_iovlen = 1,
1007        };
1008        unsigned char cmsgbuf[256];
1009        struct cmsghdr *cm = (struct cmsghdr *)cmsgbuf;
1010        char buf[16*1024];
1011        int ifindex;
1012        int len;
1013
1014        iov[0].iov_base = (caddr_t)buf;
1015        iov[0].iov_len = sizeof(buf);
1016
1017        memset(cmsgbuf, 0, sizeof(cmsgbuf));
1018        m.msg_control = (caddr_t)cm;
1019        m.msg_controllen = sizeof(cmsgbuf);
1020
1021        len = recvmsg(sd, &m, 0);
1022        if (len == 0) {
1023                log_msg("peer closed connection.\n");
1024                return 0;
1025        } else if (len < 0) {
1026                log_msg("failed to read message: %d: %s\n",
1027                        errno, strerror(errno));
1028                return -1;
1029        }
1030
1031        buf[len] = '\0';
1032
1033        log_address("Message from:", sa);
1034        log_msg("    %.24s%s\n", buf, len > 24 ? " ..." : "");
1035
1036        ifindex = get_index_from_cmsg(&m);
1037        if (args->expected_ifindex) {
1038                if (args->expected_ifindex != ifindex) {
1039                        log_error("Device index mismatch: expected %d have %d\n",
1040                                  args->expected_ifindex, ifindex);
1041                        return -1;
1042                }
1043                log_msg("Device index matches: expected %d have %d\n",
1044                        args->expected_ifindex, ifindex);
1045        }
1046
1047        if (!interactive && server_mode) {
1048                if (sa->sa_family == AF_INET6) {
1049                        struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
1050                        struct in6_addr *in6 = &s6->sin6_addr;
1051
1052                        if (IN6_IS_ADDR_V4MAPPED(in6)) {
1053                                const uint32_t *pa = (uint32_t *) &in6->s6_addr;
1054                                struct in_addr in4;
1055                                struct sockaddr_in *sin;
1056
1057                                sin = (struct sockaddr_in *) addr;
1058                                pa += 3;
1059                                in4.s_addr = *pa;
1060                                sin->sin_addr = in4;
1061                                sin->sin_family = AF_INET;
1062                                if (send_msg_cmsg(sd, addr, alen,
1063                                                  ifindex, AF_INET) < 0)
1064                                        goto out_err;
1065                        }
1066                }
1067again:
1068                iov[0].iov_len = len;
1069
1070                if (args->version == AF_INET6) {
1071                        struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) sa;
1072
1073                        if (args->dev) {
1074                                /* avoid PKTINFO conflicts with bindtodev */
1075                                if (sendto(sd, buf, len, 0,
1076                                           (void *) addr, alen) < 0)
1077                                        goto out_err;
1078                        } else {
1079                                /* kernel is allowing scope_id to be set to VRF
1080                                 * index for LLA. for sends to global address
1081                                 * reset scope id
1082                                 */
1083                                s6->sin6_scope_id = ifindex;
1084                                if (sendmsg(sd, &m, 0) < 0)
1085                                        goto out_err;
1086                        }
1087                } else {
1088                        int err;
1089
1090                        err = sendmsg(sd, &m, 0);
1091                        if (err < 0) {
1092                                if (errno == EACCES && try_broadcast) {
1093                                        try_broadcast = 0;
1094                                        if (!set_broadcast(sd))
1095                                                goto again;
1096                                        errno = EACCES;
1097                                }
1098                                goto out_err;
1099                        }
1100                }
1101                log_msg("Sent message:\n");
1102                log_msg("    %.24s%s\n", buf, len > 24 ? " ..." : "");
1103        }
1104
1105        return 1;
1106out_err:
1107        log_err_errno("failed to send msg to peer");
1108        return -1;
1109}
1110
1111static int socket_read_stream(int sd)
1112{
1113        char buf[1024];
1114        int len;
1115
1116        len = read(sd, buf, sizeof(buf)-1);
1117        if (len == 0) {
1118                log_msg("client closed connection.\n");
1119                return 0;
1120        } else if (len < 0) {
1121                log_msg("failed to read message\n");
1122                return -1;
1123        }
1124
1125        buf[len] = '\0';
1126        log_msg("Incoming message:\n");
1127        log_msg("    %.24s%s\n", buf, len > 24 ? " ..." : "");
1128
1129        if (!interactive && server_mode) {
1130                if (write(sd, buf, len) < 0) {
1131                        log_err_errno("failed to send buf");
1132                        return -1;
1133                }
1134                log_msg("Sent message:\n");
1135                log_msg("     %.24s%s\n", buf, len > 24 ? " ..." : "");
1136        }
1137
1138        return 1;
1139}
1140
1141static int socket_read(int sd, struct sock_args *args)
1142{
1143        if (args->type == SOCK_STREAM)
1144                return socket_read_stream(sd);
1145
1146        return socket_read_dgram(sd, args);
1147}
1148
1149static int stdin_to_socket(int sd, int type, void *addr, socklen_t alen)
1150{
1151        char buf[1024];
1152        int len;
1153
1154        if (fgets(buf, sizeof(buf), stdin) == NULL)
1155                return 0;
1156
1157        len = strlen(buf);
1158        if (type == SOCK_STREAM) {
1159                if (write(sd, buf, len) < 0) {
1160                        log_err_errno("failed to send buf");
1161                        return -1;
1162                }
1163        } else {
1164                int err;
1165
1166again:
1167                err = sendto(sd, buf, len, 0, addr, alen);
1168                if (err < 0) {
1169                        if (errno == EACCES && try_broadcast) {
1170                                try_broadcast = 0;
1171                                if (!set_broadcast(sd))
1172                                        goto again;
1173                                errno = EACCES;
1174                        }
1175                        log_err_errno("failed to send msg to peer");
1176                        return -1;
1177                }
1178        }
1179        log_msg("Sent message:\n");
1180        log_msg("    %.24s%s\n", buf, len > 24 ? " ..." : "");
1181
1182        return 1;
1183}
1184
1185static void set_recv_attr(int sd, int version)
1186{
1187        if (version == AF_INET6) {
1188                set_recvpktinfo_v6(sd);
1189                set_recverr_v6(sd);
1190        } else {
1191                set_pktinfo_v4(sd);
1192                set_recverr_v4(sd);
1193        }
1194}
1195
1196static int msg_loop(int client, int sd, void *addr, socklen_t alen,
1197                    struct sock_args *args)
1198{
1199        struct timeval timeout = { .tv_sec = prog_timeout }, *ptval = NULL;
1200        fd_set rfds;
1201        int nfds;
1202        int rc;
1203
1204        if (args->type != SOCK_STREAM)
1205                set_recv_attr(sd, args->version);
1206
1207        if (msg) {
1208                msglen = strlen(msg);
1209
1210                /* client sends first message */
1211                if (client) {
1212                        if (send_msg(sd, addr, alen, args))
1213                                return 1;
1214                }
1215                if (!interactive) {
1216                        ptval = &timeout;
1217                        if (!prog_timeout)
1218                                timeout.tv_sec = 5;
1219                }
1220        }
1221
1222        nfds = interactive ? MAX(fileno(stdin), sd)  + 1 : sd + 1;
1223        while (1) {
1224                FD_ZERO(&rfds);
1225                FD_SET(sd, &rfds);
1226                if (interactive)
1227                        FD_SET(fileno(stdin), &rfds);
1228
1229                rc = select(nfds, &rfds, NULL, NULL, ptval);
1230                if (rc < 0) {
1231                        if (errno == EINTR)
1232                                continue;
1233
1234                        rc = 1;
1235                        log_err_errno("select failed");
1236                        break;
1237                } else if (rc == 0) {
1238                        log_error("Timed out waiting for response\n");
1239                        rc = 2;
1240                        break;
1241                }
1242
1243                if (FD_ISSET(sd, &rfds)) {
1244                        rc = socket_read(sd, args);
1245                        if (rc < 0) {
1246                                rc = 1;
1247                                break;
1248                        }
1249                        if (rc == 0)
1250                                break;
1251                }
1252
1253                rc = 0;
1254
1255                if (FD_ISSET(fileno(stdin), &rfds)) {
1256                        if (stdin_to_socket(sd, args->type, addr, alen) <= 0)
1257                                break;
1258                }
1259
1260                if (interactive)
1261                        continue;
1262
1263                if (iter != -1) {
1264                        --iter;
1265                        if (iter == 0)
1266                                break;
1267                }
1268
1269                log_msg("Going into quiet mode\n");
1270                quiet = 1;
1271
1272                if (client) {
1273                        if (send_msg(sd, addr, alen, args)) {
1274                                rc = 1;
1275                                break;
1276                        }
1277                }
1278        }
1279
1280        return rc;
1281}
1282
1283static int msock_init(struct sock_args *args, int server)
1284{
1285        uint32_t if_addr = htonl(INADDR_ANY);
1286        struct sockaddr_in laddr = {
1287                .sin_family = AF_INET,
1288                .sin_port = htons(args->port),
1289        };
1290        int one = 1;
1291        int sd;
1292
1293        if (!server && args->has_local_ip)
1294                if_addr = args->local_addr.in.s_addr;
1295
1296        sd = socket(PF_INET, SOCK_DGRAM, 0);
1297        if (sd < 0) {
1298                log_err_errno("socket");
1299                return -1;
1300        }
1301
1302        if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
1303                       (char *)&one, sizeof(one)) < 0) {
1304                log_err_errno("Setting SO_REUSEADDR error");
1305                goto out_err;
1306        }
1307
1308        if (setsockopt(sd, SOL_SOCKET, SO_BROADCAST,
1309                       (char *)&one, sizeof(one)) < 0)
1310                log_err_errno("Setting SO_BROADCAST error");
1311
1312        if (args->dev && bind_to_device(sd, args->dev) != 0)
1313                goto out_err;
1314        else if (args->use_setsockopt &&
1315                 set_multicast_if(sd, args->ifindex))
1316                goto out_err;
1317
1318        laddr.sin_addr.s_addr = if_addr;
1319
1320        if (bind(sd, (struct sockaddr *) &laddr, sizeof(laddr)) < 0) {
1321                log_err_errno("bind failed");
1322                goto out_err;
1323        }
1324
1325        if (server &&
1326            set_membership(sd, args->grp.s_addr,
1327                           args->local_addr.in.s_addr, args->ifindex))
1328                goto out_err;
1329
1330        return sd;
1331out_err:
1332        close(sd);
1333        return -1;
1334}
1335
1336static int msock_server(struct sock_args *args)
1337{
1338        return msock_init(args, 1);
1339}
1340
1341static int msock_client(struct sock_args *args)
1342{
1343        return msock_init(args, 0);
1344}
1345
1346static int bind_socket(int sd, struct sock_args *args)
1347{
1348        struct sockaddr_in serv_addr = {
1349                .sin_family = AF_INET,
1350        };
1351        struct sockaddr_in6 serv6_addr = {
1352                .sin6_family = AF_INET6,
1353        };
1354        void *addr;
1355        socklen_t alen;
1356
1357        if (!args->has_local_ip && args->type == SOCK_RAW)
1358                return 0;
1359
1360        switch (args->version) {
1361        case AF_INET:
1362                serv_addr.sin_port = htons(args->port);
1363                serv_addr.sin_addr = args->local_addr.in;
1364                addr = &serv_addr;
1365                alen = sizeof(serv_addr);
1366                break;
1367
1368        case AF_INET6:
1369                serv6_addr.sin6_port = htons(args->port);
1370                serv6_addr.sin6_addr = args->local_addr.in6;
1371                addr = &serv6_addr;
1372                alen = sizeof(serv6_addr);
1373                break;
1374
1375        default:
1376                log_error("Invalid address family\n");
1377                return -1;
1378        }
1379
1380        if (bind(sd, addr, alen) < 0) {
1381                log_err_errno("error binding socket");
1382                return -1;
1383        }
1384
1385        return 0;
1386}
1387
1388static int config_xfrm_policy(int sd, struct sock_args *args)
1389{
1390        struct xfrm_userpolicy_info policy = {};
1391        int type = UDP_ENCAP_ESPINUDP;
1392        int xfrm_af = IP_XFRM_POLICY;
1393        int level = SOL_IP;
1394
1395        if (args->type != SOCK_DGRAM) {
1396                log_error("Invalid socket type. Only DGRAM could be used for XFRM\n");
1397                return 1;
1398        }
1399
1400        policy.action = XFRM_POLICY_ALLOW;
1401        policy.sel.family = args->version;
1402        if (args->version == AF_INET6) {
1403                xfrm_af = IPV6_XFRM_POLICY;
1404                level = SOL_IPV6;
1405        }
1406
1407        policy.dir = XFRM_POLICY_OUT;
1408        if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
1409                return 1;
1410
1411        policy.dir = XFRM_POLICY_IN;
1412        if (setsockopt(sd, level, xfrm_af, &policy, sizeof(policy)) < 0)
1413                return 1;
1414
1415        if (setsockopt(sd, IPPROTO_UDP, UDP_ENCAP, &type, sizeof(type)) < 0) {
1416                log_err_errno("Failed to set xfrm encap");
1417                return 1;
1418        }
1419
1420        return 0;
1421}
1422
1423static int lsock_init(struct sock_args *args)
1424{
1425        long flags;
1426        int sd;
1427
1428        sd = socket(args->version, args->type, args->protocol);
1429        if (sd < 0) {
1430                log_err_errno("Error opening socket");
1431                return  -1;
1432        }
1433
1434        if (set_reuseaddr(sd) != 0)
1435                goto err;
1436
1437        if (set_reuseport(sd) != 0)
1438                goto err;
1439
1440        if (args->dev && bind_to_device(sd, args->dev) != 0)
1441                goto err;
1442        else if (args->use_setsockopt &&
1443                 set_unicast_if(sd, args->ifindex, args->version))
1444                goto err;
1445
1446        if (args->use_freebind && set_freebind(sd, args->version))
1447                goto err;
1448
1449        if (bind_socket(sd, args))
1450                goto err;
1451
1452        if (args->bind_test_only)
1453                goto out;
1454
1455        if (args->type == SOCK_STREAM && listen(sd, 1) < 0) {
1456                log_err_errno("listen failed");
1457                goto err;
1458        }
1459
1460        flags = fcntl(sd, F_GETFL);
1461        if ((flags < 0) || (fcntl(sd, F_SETFL, flags|O_NONBLOCK) < 0)) {
1462                log_err_errno("Failed to set non-blocking option");
1463                goto err;
1464        }
1465
1466        if (fcntl(sd, F_SETFD, FD_CLOEXEC) < 0)
1467                log_err_errno("Failed to set close-on-exec flag");
1468
1469        if (args->use_xfrm && config_xfrm_policy(sd, args)) {
1470                log_err_errno("Failed to set xfrm policy");
1471                goto err;
1472        }
1473
1474out:
1475        return sd;
1476
1477err:
1478        close(sd);
1479        return -1;
1480}
1481
1482static void ipc_write(int fd, int message)
1483{
1484        /* Not in both_mode, so there's no process to signal */
1485        if (fd < 0)
1486                return;
1487
1488        if (write(fd, &message, sizeof(message)) < 0)
1489                log_err_errno("Failed to send client status");
1490}
1491
1492static int do_server(struct sock_args *args, int ipc_fd)
1493{
1494        /* ipc_fd = -1 if no parent process to signal */
1495        struct timeval timeout = { .tv_sec = prog_timeout }, *ptval = NULL;
1496        unsigned char addr[sizeof(struct sockaddr_in6)] = {};
1497        socklen_t alen = sizeof(addr);
1498        int lsd, csd = -1;
1499
1500        fd_set rfds;
1501        int rc;
1502
1503        if (args->serverns) {
1504                if (switch_ns(args->serverns)) {
1505                        log_error("Could not set server netns to %s\n",
1506                                  args->serverns);
1507                        goto err_exit;
1508                }
1509                log_msg("Switched server netns\n");
1510        }
1511
1512        args->dev = args->server_dev;
1513        args->expected_dev = args->expected_server_dev;
1514        if (resolve_devices(args) || validate_addresses(args))
1515                goto err_exit;
1516
1517        if (prog_timeout)
1518                ptval = &timeout;
1519
1520        if (args->has_grp)
1521                lsd = msock_server(args);
1522        else
1523                lsd = lsock_init(args);
1524
1525        if (lsd < 0)
1526                goto err_exit;
1527
1528        if (args->bind_test_only) {
1529                close(lsd);
1530                ipc_write(ipc_fd, 1);
1531                return 0;
1532        }
1533
1534        if (args->type != SOCK_STREAM) {
1535                ipc_write(ipc_fd, 1);
1536                rc = msg_loop(0, lsd, (void *) addr, alen, args);
1537                close(lsd);
1538                return rc;
1539        }
1540
1541        if (args->password && tcp_md5_remote(lsd, args)) {
1542                close(lsd);
1543                goto err_exit;
1544        }
1545
1546        ipc_write(ipc_fd, 1);
1547        while (1) {
1548                log_msg("waiting for client connection.\n");
1549                FD_ZERO(&rfds);
1550                FD_SET(lsd, &rfds);
1551
1552                rc = select(lsd+1, &rfds, NULL, NULL, ptval);
1553                if (rc == 0) {
1554                        rc = 2;
1555                        break;
1556                }
1557
1558                if (rc < 0) {
1559                        if (errno == EINTR)
1560                                continue;
1561
1562                        log_err_errno("select failed");
1563                        break;
1564                }
1565
1566                if (FD_ISSET(lsd, &rfds)) {
1567
1568                        csd = accept(lsd, (void *) addr, &alen);
1569                        if (csd < 0) {
1570                                log_err_errno("accept failed");
1571                                break;
1572                        }
1573
1574                        rc = show_sockstat(csd, args);
1575                        if (rc)
1576                                break;
1577
1578                        rc = check_device(csd, args);
1579                        if (rc)
1580                                break;
1581                }
1582
1583                rc = msg_loop(0, csd, (void *) addr, alen, args);
1584                close(csd);
1585
1586                if (!interactive)
1587                        break;
1588        }
1589
1590        close(lsd);
1591
1592        return rc;
1593err_exit:
1594        ipc_write(ipc_fd, 0);
1595        return 1;
1596}
1597
1598static int wait_for_connect(int sd)
1599{
1600        struct timeval _tv = { .tv_sec = prog_timeout }, *tv = NULL;
1601        fd_set wfd;
1602        int val = 0, sz = sizeof(val);
1603        int rc;
1604
1605        FD_ZERO(&wfd);
1606        FD_SET(sd, &wfd);
1607
1608        if (prog_timeout)
1609                tv = &_tv;
1610
1611        rc = select(FD_SETSIZE, NULL, &wfd, NULL, tv);
1612        if (rc == 0) {
1613                log_error("connect timed out\n");
1614                return -2;
1615        } else if (rc < 0) {
1616                log_err_errno("select failed");
1617                return -3;
1618        }
1619
1620        if (getsockopt(sd, SOL_SOCKET, SO_ERROR, &val, (socklen_t *)&sz) < 0) {
1621                log_err_errno("getsockopt(SO_ERROR) failed");
1622                return -4;
1623        }
1624
1625        if (val != 0) {
1626                log_error("connect failed: %d: %s\n", val, strerror(val));
1627                return -1;
1628        }
1629
1630        return 0;
1631}
1632
1633static int connectsock(void *addr, socklen_t alen, struct sock_args *args)
1634{
1635        int sd, rc = -1;
1636        long flags;
1637
1638        sd = socket(args->version, args->type, args->protocol);
1639        if (sd < 0) {
1640                log_err_errno("Failed to create socket");
1641                return -1;
1642        }
1643
1644        flags = fcntl(sd, F_GETFL);
1645        if ((flags < 0) || (fcntl(sd, F_SETFL, flags|O_NONBLOCK) < 0)) {
1646                log_err_errno("Failed to set non-blocking option");
1647                goto err;
1648        }
1649
1650        if (set_reuseport(sd) != 0)
1651                goto err;
1652
1653        if (args->dev && bind_to_device(sd, args->dev) != 0)
1654                goto err;
1655        else if (args->use_setsockopt &&
1656                 set_unicast_if(sd, args->ifindex, args->version))
1657                goto err;
1658
1659        if (args->has_local_ip && bind_socket(sd, args))
1660                goto err;
1661
1662        if (args->type != SOCK_STREAM)
1663                goto out;
1664
1665        if (args->password && tcp_md5sig(sd, addr, alen, args))
1666                goto err;
1667
1668        if (args->bind_test_only)
1669                goto out;
1670
1671        if (connect(sd, addr, alen) < 0) {
1672                if (errno != EINPROGRESS) {
1673                        log_err_errno("Failed to connect to remote host");
1674                        rc = -1;
1675                        goto err;
1676                }
1677                rc = wait_for_connect(sd);
1678                if (rc < 0)
1679                        goto err;
1680        }
1681out:
1682        return sd;
1683
1684err:
1685        close(sd);
1686        return rc;
1687}
1688
1689static int do_client(struct sock_args *args)
1690{
1691        struct sockaddr_in sin = {
1692                .sin_family = AF_INET,
1693        };
1694        struct sockaddr_in6 sin6 = {
1695                .sin6_family = AF_INET6,
1696        };
1697        void *addr;
1698        int alen;
1699        int rc = 0;
1700        int sd;
1701
1702        if (!args->has_remote_ip && !args->has_grp) {
1703                fprintf(stderr, "remote IP or multicast group not given\n");
1704                return 1;
1705        }
1706
1707        if (args->clientns) {
1708                if (switch_ns(args->clientns)) {
1709                        log_error("Could not set client netns to %s\n",
1710                                  args->clientns);
1711                        return 1;
1712                }
1713                log_msg("Switched client netns\n");
1714        }
1715
1716        args->local_addr_str = args->client_local_addr_str;
1717        if (resolve_devices(args) || validate_addresses(args))
1718                return 1;
1719
1720        if ((args->use_setsockopt || args->use_cmsg) && !args->ifindex) {
1721                fprintf(stderr, "Device binding not specified\n");
1722                return 1;
1723        }
1724        if (args->use_setsockopt || args->use_cmsg)
1725                args->dev = NULL;
1726
1727        switch (args->version) {
1728        case AF_INET:
1729                sin.sin_port = htons(args->port);
1730                if (args->has_grp)
1731                        sin.sin_addr = args->grp;
1732                else
1733                        sin.sin_addr = args->remote_addr.in;
1734                addr = &sin;
1735                alen = sizeof(sin);
1736                break;
1737        case AF_INET6:
1738                sin6.sin6_port = htons(args->port);
1739                sin6.sin6_addr = args->remote_addr.in6;
1740                sin6.sin6_scope_id = args->scope_id;
1741                addr = &sin6;
1742                alen = sizeof(sin6);
1743                break;
1744        }
1745
1746        args->password = args->client_pw;
1747
1748        if (args->has_grp)
1749                sd = msock_client(args);
1750        else
1751                sd = connectsock(addr, alen, args);
1752
1753        if (sd < 0)
1754                return -sd;
1755
1756        if (args->bind_test_only)
1757                goto out;
1758
1759        if (args->type == SOCK_STREAM) {
1760                rc = show_sockstat(sd, args);
1761                if (rc != 0)
1762                        goto out;
1763        }
1764
1765        rc = msg_loop(1, sd, addr, alen, args);
1766
1767out:
1768        close(sd);
1769
1770        return rc;
1771}
1772
1773static char *random_msg(int len)
1774{
1775        int i, n = 0, olen = len + 1;
1776        char *m;
1777
1778        if (len <= 0)
1779                return NULL;
1780
1781        m = malloc(olen);
1782        if (!m)
1783                return NULL;
1784
1785        while (len > 26) {
1786                i = snprintf(m + n, olen - n, "%.26s",
1787                             "abcdefghijklmnopqrstuvwxyz");
1788                n += i;
1789                len -= i;
1790        }
1791        i = snprintf(m + n, olen - n, "%.*s", len,
1792                     "abcdefghijklmnopqrstuvwxyz");
1793        return m;
1794}
1795
1796static int ipc_child(int fd, struct sock_args *args)
1797{
1798        char *outbuf, *errbuf;
1799        int rc = 1;
1800
1801        outbuf = malloc(4096);
1802        errbuf = malloc(4096);
1803        if (!outbuf || !errbuf) {
1804                fprintf(stderr, "server: Failed to allocate buffers for stdout and stderr\n");
1805                goto out;
1806        }
1807
1808        setbuffer(stdout, outbuf, 4096);
1809        setbuffer(stderr, errbuf, 4096);
1810
1811        server_mode = 1; /* to tell log_msg in case we are in both_mode */
1812
1813        /* when running in both mode, address validation applies
1814         * solely to client side
1815         */
1816        args->has_expected_laddr = 0;
1817        args->has_expected_raddr = 0;
1818
1819        rc = do_server(args, fd);
1820
1821out:
1822        free(outbuf);
1823        free(errbuf);
1824
1825        return rc;
1826}
1827
1828static int ipc_parent(int cpid, int fd, struct sock_args *args)
1829{
1830        int client_status;
1831        int status;
1832        int buf;
1833
1834        /* do the client-side function here in the parent process,
1835         * waiting to be told when to continue
1836         */
1837        if (read(fd, &buf, sizeof(buf)) <= 0) {
1838                log_err_errno("Failed to read IPC status from status");
1839                return 1;
1840        }
1841        if (!buf) {
1842                log_error("Server failed; can not continue\n");
1843                return 1;
1844        }
1845        log_msg("Server is ready\n");
1846
1847        client_status = do_client(args);
1848        log_msg("parent is done!\n");
1849
1850        if (kill(cpid, 0) == 0)
1851                kill(cpid, SIGKILL);
1852
1853        wait(&status);
1854        return client_status;
1855}
1856
1857#define GETOPT_STR  "sr:l:c:p:t:g:P:DRn:M:X:m:d:I:BN:O:SCi6xL:0:1:2:3:Fbqf"
1858#define OPT_FORCE_BIND_KEY_IFINDEX 1001
1859#define OPT_NO_BIND_KEY_IFINDEX 1002
1860
1861static struct option long_opts[] = {
1862        {"force-bind-key-ifindex", 0, 0, OPT_FORCE_BIND_KEY_IFINDEX},
1863        {"no-bind-key-ifindex", 0, 0, OPT_NO_BIND_KEY_IFINDEX},
1864        {0, 0, 0, 0}
1865};
1866
1867static void print_usage(char *prog)
1868{
1869        printf(
1870        "usage: %s OPTS\n"
1871        "Required:\n"
1872        "    -r addr       remote address to connect to (client mode only)\n"
1873        "    -p port       port to connect to (client mode)/listen on (server mode)\n"
1874        "                  (default: %d)\n"
1875        "    -s            server mode (default: client mode)\n"
1876        "    -t            timeout seconds (default: none)\n"
1877        "\n"
1878        "Optional:\n"
1879        "    -B            do both client and server via fork and IPC\n"
1880        "    -N ns         set client to network namespace ns (requires root)\n"
1881        "    -O ns         set server to network namespace ns (requires root)\n"
1882        "    -F            Restart server loop\n"
1883        "    -6            IPv6 (default is IPv4)\n"
1884        "    -P proto      protocol for socket: icmp, ospf (default: none)\n"
1885        "    -D|R          datagram (D) / raw (R) socket (default stream)\n"
1886        "    -l addr       local address to bind to in server mode\n"
1887        "    -c addr       local address to bind to in client mode\n"
1888        "    -x            configure XFRM policy on socket\n"
1889        "\n"
1890        "    -d dev        bind socket to given device name\n"
1891        "    -I dev        bind socket to given device name - server mode\n"
1892        "    -S            use setsockopt (IP_UNICAST_IF or IP_MULTICAST_IF)\n"
1893        "                  to set device binding\n"
1894        "    -f            bind socket with the IP[V6]_FREEBIND option\n"
1895        "    -C            use cmsg and IP_PKTINFO to specify device binding\n"
1896        "\n"
1897        "    -L len        send random message of given length\n"
1898        "    -n num        number of times to send message\n"
1899        "\n"
1900        "    -M password   use MD5 sum protection\n"
1901        "    -X password   MD5 password for client mode\n"
1902        "    -m prefix/len prefix and length to use for MD5 key\n"
1903        "    --no-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX off\n"
1904        "    --force-bind-key-ifindex: Force TCP_MD5SIG_FLAG_IFINDEX on\n"
1905        "        (default: only if -I is passed)\n"
1906        "\n"
1907        "    -g grp        multicast group (e.g., 239.1.1.1)\n"
1908        "    -i            interactive mode (default is echo and terminate)\n"
1909        "\n"
1910        "    -0 addr       Expected local address\n"
1911        "    -1 addr       Expected remote address\n"
1912        "    -2 dev        Expected device name (or index) to receive packet\n"
1913        "    -3 dev        Expected device name (or index) to receive packets - server mode\n"
1914        "\n"
1915        "    -b            Bind test only.\n"
1916        "    -q            Be quiet. Run test without printing anything.\n"
1917        , prog, DEFAULT_PORT);
1918}
1919
1920int main(int argc, char *argv[])
1921{
1922        struct sock_args args = {
1923                .version = AF_INET,
1924                .type    = SOCK_STREAM,
1925                .port    = DEFAULT_PORT,
1926        };
1927        struct protoent *pe;
1928        int both_mode = 0;
1929        unsigned int tmp;
1930        int forever = 0;
1931        int fd[2];
1932        int cpid;
1933
1934        /* process inputs */
1935        extern char *optarg;
1936        int rc = 0;
1937
1938        /*
1939         * process input args
1940         */
1941
1942        while ((rc = getopt_long(argc, argv, GETOPT_STR, long_opts, NULL)) != -1) {
1943                switch (rc) {
1944                case 'B':
1945                        both_mode = 1;
1946                        break;
1947                case 's':
1948                        server_mode = 1;
1949                        break;
1950                case 'F':
1951                        forever = 1;
1952                        break;
1953                case 'l':
1954                        args.has_local_ip = 1;
1955                        args.local_addr_str = optarg;
1956                        break;
1957                case 'r':
1958                        args.has_remote_ip = 1;
1959                        args.remote_addr_str = optarg;
1960                        break;
1961                case 'c':
1962                        args.has_local_ip = 1;
1963                        args.client_local_addr_str = optarg;
1964                        break;
1965                case 'p':
1966                        if (str_to_uint(optarg, 1, 65535, &tmp) != 0) {
1967                                fprintf(stderr, "Invalid port\n");
1968                                return 1;
1969                        }
1970                        args.port = (unsigned short) tmp;
1971                        break;
1972                case 't':
1973                        if (str_to_uint(optarg, 0, INT_MAX,
1974                                        &prog_timeout) != 0) {
1975                                fprintf(stderr, "Invalid timeout\n");
1976                                return 1;
1977                        }
1978                        break;
1979                case 'D':
1980                        args.type = SOCK_DGRAM;
1981                        break;
1982                case 'R':
1983                        args.type = SOCK_RAW;
1984                        args.port = 0;
1985                        if (!args.protocol)
1986                                args.protocol = IPPROTO_RAW;
1987                        break;
1988                case 'P':
1989                        pe = getprotobyname(optarg);
1990                        if (pe) {
1991                                args.protocol = pe->p_proto;
1992                        } else {
1993                                if (str_to_uint(optarg, 0, 0xffff, &tmp) != 0) {
1994                                        fprintf(stderr, "Invalid protocol\n");
1995                                        return 1;
1996                                }
1997                                args.protocol = tmp;
1998                        }
1999                        break;
2000                case 'n':
2001                        iter = atoi(optarg);
2002                        break;
2003                case 'N':
2004                        args.clientns = optarg;
2005                        break;
2006                case 'O':
2007                        args.serverns = optarg;
2008                        break;
2009                case 'L':
2010                        msg = random_msg(atoi(optarg));
2011                        break;
2012                case 'M':
2013                        args.password = optarg;
2014                        break;
2015                case OPT_FORCE_BIND_KEY_IFINDEX:
2016                        args.bind_key_ifindex = 1;
2017                        break;
2018                case OPT_NO_BIND_KEY_IFINDEX:
2019                        args.bind_key_ifindex = -1;
2020                        break;
2021                case 'X':
2022                        args.client_pw = optarg;
2023                        break;
2024                case 'm':
2025                        args.md5_prefix_str = optarg;
2026                        break;
2027                case 'S':
2028                        args.use_setsockopt = 1;
2029                        break;
2030                case 'f':
2031                        args.use_freebind = 1;
2032                        break;
2033                case 'C':
2034                        args.use_cmsg = 1;
2035                        break;
2036                case 'd':
2037                        args.dev = optarg;
2038                        break;
2039                case 'I':
2040                        args.server_dev = optarg;
2041                        break;
2042                case 'i':
2043                        interactive = 1;
2044                        break;
2045                case 'g':
2046                        args.has_grp = 1;
2047                        if (convert_addr(&args, optarg, ADDR_TYPE_MCAST) < 0)
2048                                return 1;
2049                        args.type = SOCK_DGRAM;
2050                        break;
2051                case '6':
2052                        args.version = AF_INET6;
2053                        break;
2054                case 'b':
2055                        args.bind_test_only = 1;
2056                        break;
2057                case '0':
2058                        args.has_expected_laddr = 1;
2059                        args.expected_laddr_str = optarg;
2060                        break;
2061                case '1':
2062                        args.has_expected_raddr = 1;
2063                        args.expected_raddr_str = optarg;
2064                        break;
2065                case '2':
2066                        args.expected_dev = optarg;
2067                        break;
2068                case '3':
2069                        args.expected_server_dev = optarg;
2070                        break;
2071                case 'q':
2072                        quiet = 1;
2073                        break;
2074                case 'x':
2075                        args.use_xfrm = 1;
2076                        break;
2077                default:
2078                        print_usage(argv[0]);
2079                        return 1;
2080                }
2081        }
2082
2083        if (args.password &&
2084            ((!args.has_remote_ip && !args.md5_prefix_str) ||
2085              args.type != SOCK_STREAM)) {
2086                log_error("MD5 passwords apply to TCP only and require a remote ip for the password\n");
2087                return 1;
2088        }
2089
2090        if (args.md5_prefix_str && !args.password) {
2091                log_error("Prefix range for MD5 protection specified without a password\n");
2092                return 1;
2093        }
2094
2095        if (iter == 0) {
2096                fprintf(stderr, "Invalid number of messages to send\n");
2097                return 1;
2098        }
2099
2100        if (args.type == SOCK_STREAM && !args.protocol)
2101                args.protocol = IPPROTO_TCP;
2102        if (args.type == SOCK_DGRAM && !args.protocol)
2103                args.protocol = IPPROTO_UDP;
2104
2105        if ((args.type == SOCK_STREAM || args.type == SOCK_DGRAM) &&
2106             args.port == 0) {
2107                fprintf(stderr, "Invalid port number\n");
2108                return 1;
2109        }
2110
2111        if ((both_mode || !server_mode) && !args.has_grp &&
2112            !args.has_remote_ip && !args.has_local_ip) {
2113                fprintf(stderr,
2114                        "Local (server mode) or remote IP (client IP) required\n");
2115                return 1;
2116        }
2117
2118        if (interactive) {
2119                prog_timeout = 0;
2120                msg = NULL;
2121        }
2122
2123        if (both_mode) {
2124                if (pipe(fd) < 0) {
2125                        perror("pipe");
2126                        exit(1);
2127                }
2128
2129                cpid = fork();
2130                if (cpid < 0) {
2131                        perror("fork");
2132                        exit(1);
2133                }
2134                if (cpid)
2135                        return ipc_parent(cpid, fd[0], &args);
2136
2137                return ipc_child(fd[1], &args);
2138        }
2139
2140        if (server_mode) {
2141                do {
2142                        rc = do_server(&args, -1);
2143                } while (forever);
2144
2145                return rc;
2146        }
2147        return do_client(&args);
2148}
2149