On Mon, Mar 13, 2017 at 4:21 PM, Justin Cinkelj <[email protected]>
wrote:

> Based on what open-mpi does.
>

Did you copy code from open-mpi? Is the license compatible? Should we add a
copyright comment?

Also, what I see below doesn't seem to be a test - how can it fail?
Maybe you want it in tests/misc-something, i.e., test code which you can
run yourself when you want, but isn't part of the official test suite?


> On AWS and xen-server IFF_SLAVE is set, and it should not be.
>

Very interesting - I think I know where this bug is coming from...

We have IFF_SLAVE and IFF_SIMPLEX translate to the same bit (0x800). And
then, in bsd/sys/dev/xen/netfront/netfront.cc we put:

bsd/sys/dev/xen/netfront/netfront.cc:        ifp->if_flags = IFF_BROADCAST
| IFF_SIMPLEX | IFF_MULTICAST;

We need to understand how IFF_SLAVE and IFF_SIMPLEX came to have the same
bit... Did we get one from BSD and one from Linux?

Can you please open an issue about it?




>
> Signed-off-by: Justin Cinkelj <[email protected]>
> ---
>  tests/tst-ifaddrs.cc | 121 ++++++++++++++++++++++++++++++
> ++++++++++++++++++++-
>  1 file changed, 120 insertions(+), 1 deletion(-)
>
> diff --git a/tests/tst-ifaddrs.cc b/tests/tst-ifaddrs.cc
> index bfb682c..983a466 100644
> --- a/tests/tst-ifaddrs.cc
> +++ b/tests/tst-ifaddrs.cc
> @@ -22,6 +22,8 @@
>
>  #include <linux/if_packet.h> // for sockaddr_ll
>
> +int main2(int argc, char *argv[]);
> +
>  static int tests = 0, fails = 0;
>
>  template<typename T>
> @@ -62,7 +64,7 @@ bool do_expectge(T actual, T expected, const char
> *actuals, const char *expected
>          do_expectge(var, 0, #call, "0", __FILE__, __LINE__); \
>          do_expect(errno, 0, #call " errno",  "0", __FILE__, __LINE__);
>
> -int main()
> +int main(int argc, char *argv[])
>  {
>      // Start by testing if_nameindex() because Musl's get_ifaddrs()
> actually
>      // uses that, and the second won't work if the first doesn't.
> @@ -174,6 +176,123 @@ noni:
>
>      freeifaddrs(ifaddr);
>
> +    main2(argc, argv);
> +
>      std::cout << "SUMMARY: " << tests << " tests, " << fails << "
> failures\n";
>      return fails == 0 ? 0 : 1;
>  }
> +
> +
> +//#include <stdio.h>
> +//#include <stdlib.h>
> +#include <unistd.h>
> +#include <string.h>
> +//#include <sys/socket.h>
> +#include <sys/ioctl.h>
> +//#include <linux/if.h>
> +//#include <netinet/in.h>
> +//#include <arpa/inet.h>
> +#include <net/if.h>
> +
> +#define print_flag(flags, IFF_X) { printf( "    %d = " #IFF_X "
> (0x%08x)\n", (flags & IFF_X) != 0, IFF_X); }
> +void print_all_flags(uint32_t flags)
> +{
> +printf( "  flags = 0x%08x\n", flags);
> +
> +print_flag(flags, IFF_UP);
> +print_flag(flags, IFF_BROADCAST);
> +print_flag(flags, IFF_DEBUG);
> +print_flag(flags, IFF_LOOPBACK);
> +print_flag(flags, IFF_POINTOPOINT);
> +print_flag(flags, IFF_NOTRAILERS);
> +print_flag(flags, IFF_RUNNING);
> +print_flag(flags, IFF_NOARP);
> +print_flag(flags, IFF_PROMISC);
> +print_flag(flags, IFF_ALLMULTI);
> +print_flag(flags, IFF_MASTER);
> +print_flag(flags, IFF_SLAVE);
> +print_flag(flags, IFF_MULTICAST);
> +print_flag(flags, IFF_PORTSEL);
> +print_flag(flags, IFF_AUTOMEDIA);
> +print_flag(flags, IFF_DYNAMIC);
> +}
> +
> +#define MAX_IFCONF_SIZE 1024
> +#define DEFAULT_NUMBER_INTERFACES 10
> +int main2(int argc, char *argv[])
> +{
> +    int sd;
> +    struct ifconf ifconf;
> +    int ifc_len;
> +    struct ifreq *ifr;
> +    const char* iface_name = nullptr;
> +
> +    printf("\n\n/* main2 ------------------------------
> ------------------*/\n");
> +
> +    if (argc >= 2) {
> +        iface_name = argv[1];
> +    }
> +    else {
> +        iface_name = "eth0";
> +    }
> +
> +    fprintf(stderr, "DBG %s:%d %s: start iface_name=%s\n",
> __FILE__,__LINE__,__FUNCTION__, iface_name);
> +    sd = socket(AF_INET, SOCK_DGRAM, 0);
> +    expectge(sd, 0);
> +
> +    ifc_len = sizeof(struct ifreq) * DEFAULT_NUMBER_INTERFACES;
> +    ifconf.ifc_len = ifc_len;
> +    ifconf.ifc_req = (ifreq*)malloc(ifc_len);
> +    if (NULL == ifconf.ifc_req) {
> +        close(sd);
> +        return -1;
> +    }
> +
> +    memset(ifconf.ifc_req, 0, ifconf.ifc_len);
> +
> +    if (ioctl(sd, SIOCGIFCONF, &ifconf) < 0) {
> +        printf("opal_ifinit: ioctl(SIOCGIFCONF) \
> +                    failed with errno=%d\n",
> +                    errno);
> +        free(ifconf.ifc_req);
> +        close(sd);
> +        return -1;
> +    }
> +
> +    int ii;
> +    printf("ifconf.ifc_len = %d, ifconf.ifc_req=%p, sz=%d\n",
> ifconf.ifc_len, ifconf.ifc_req, sizeof(ifconf.ifc_req[0]));
> +    for(ii=0; ii<ifconf.ifc_len; ii+=sizeof(ifreq)) {
> +        ifr = (ifreq*) (((char*)ifconf.ifc_req) + ii);
> +        printf("ii =%d/%d name=%s\n", ii, ifconf.ifc_len, ifr->ifr_name);
> +        if (AF_INET != ifr->ifr_addr.sa_family) {
> +            fprintf(stderr, "DBG %s:%d %s: not AF_INET\n",
> __FILE__,__LINE__,__FUNCTION__);
> +            continue;
> +        }
> +        if (strcmp(iface_name, ifr->ifr_name) == 0) {
> +            printf("iface %s found\n", iface_name);
> +            break;
> +        }
> +    }
> +    if (ii >= ifconf.ifc_len) {
> +        printf("ifr == nullprt :/, dev %s not found\n", iface_name);
> +        return 0;
> +    }
> +
> +    if (ioctl(sd, SIOCGIFFLAGS, ifr) < 0) {
> +        printf("opal_ifinit: ioctl(SIOCGIFFLAGS) failed with errno=%d\n",
> errno);
> +        fprintf(stderr, "DBG %s:%d %s: SIOCGIFFLAGS failed\n",
> __FILE__,__LINE__,__FUNCTION__);
> +    }
> +
> +    print_all_flags(ifr->ifr_flags);
> +    printf("%-8s : flags=0x%08x IFF_SLAVE=%d IFF_UP=%d
> IFF_BROADCAST=%d\n", ifr->ifr_name,
> +        ifr->ifr_flags, ifr->ifr_flags & IFF_SLAVE, ifr->ifr_flags &
> IFF_UP, ifr->ifr_flags & IFF_BROADCAST);
> +    if ((ifr->ifr_flags & IFF_UP) == 0) {
> +        fprintf(stderr, "DBG %s:%d %s: not IFF_UP\n",
> __FILE__,__LINE__,__FUNCTION__);
> +    }
> +    /* Is this a slave to a load balancer or bonded channel?
> +       If so, don't use it -- pick up the master instead */
> +    if ((ifr->ifr_flags & IFF_SLAVE) != 0) {
> +        fprintf(stderr, "DBG %s:%d %s: is IFF_SLAVE\n",
> __FILE__,__LINE__,__FUNCTION__);
> +    }
> +
> +}
> --
> 2.9.3
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to