lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 5 Jul 2011 17:46:36 -0700
From:	Tom Herbert <therbert@...gle.com>
To:	David Miller <davem@...emloft.net>
Cc:	victor@...iniac.net, netdev@...r.kernel.org,
	Willem Bruijn <willemb@...gle.com>
Subject: Re: [PATCH 0/2] AF_PACKET fanout support

Dave,

Thanks for these patches!  Is it possible you could use an alternative
term than "fanout"?  I think this may be more often associated with a
transmit operation (e.g. multicast fanout).

Also, another useful mode of steering would be to steer packets to a
socket which was recently processed by a thread running on the same
CPU; somewhat analogous to RFS (cc'ed WIllem Bruijn who is already
working on this I believe).

Tom

On Mon, Jul 4, 2011 at 9:20 PM, David Miller <davem@...emloft.net> wrote:
>
> This is a fully functional version, I've tested both hash and
> load-balance modes successfully.  I plan to commit this to
> net-next-2.6 very soon.
>
> Below is a test program that other people can play with
> if they want.  It basically creates 4 threads, and creates
> an AF_PACKET fanout amongst them.  Each thread prints out
> it's pid in parentheses every time it receives 10 packets.
> After each thread processes 10,000 packets, it exits.
>
> Try things like "./test eth0 hash", "./test eth0 lb", etc.
>
> Signed-off-by: David S. Miller <davem@...emloft.net>
>
> --------------------
> #include <stddef.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
>
> #include <sys/types.h>
> #include <sys/wait.h>
> #include <sys/socket.h>
> #include <sys/ioctl.h>
>
> #include <unistd.h>
>
> #include <linux/if_ether.h>
> #include <linux/if_packet.h>
>
> #include <net/if.h>
>
> static const char *device_name;
> static int fanout_type;
> static int fanout_id;
>
> #ifndef PACKET_FANOUT
> #define PACKET_FANOUT           18
> #define PACKET_FANOUT_HASH              0
> #define PACKET_FANOUT_LB                1
> #endif
>
> static int setup_socket(void)
> {
>        int err, fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP));
>        struct sockaddr_ll ll;
>        struct ifreq ifr;
>        int fanout_arg;
>
>        if (fd < 0) {
>                perror("socket");
>                return EXIT_FAILURE;
>        }
>
>        memset(&ifr, 0, sizeof(ifr));
>        strcpy(ifr.ifr_name, device_name);
>        err = ioctl(fd, SIOCGIFINDEX, &ifr);
>        if (err < 0) {
>                perror("SIOCGIFINDEX");
>                return EXIT_FAILURE;
>        }
>
>        memset(&ll, 0, sizeof(ll));
>        ll.sll_family = AF_PACKET;
>        ll.sll_ifindex = ifr.ifr_ifindex;
>        err = bind(fd, (struct sockaddr *) &ll, sizeof(ll));
>        if (err < 0) {
>                perror("bind");
>                return EXIT_FAILURE;
>        }
>
>        fanout_arg = (fanout_id | (fanout_type << 16));
>        err = setsockopt(fd, SOL_PACKET, PACKET_FANOUT,
>                         &fanout_arg, sizeof(fanout_arg));
>        if (err) {
>                perror("setsockopt");
>                return EXIT_FAILURE;
>        }
>
>        return fd;
> }
>
> static void fanout_thread(void)
> {
>        int fd = setup_socket();
>        int limit = 10000;
>
>        if (fd < 0)
>                exit(fd);
>
>        while (limit-- > 0) {
>                char buf[1600];
>                int err;
>
>                err = read(fd, buf, sizeof(buf));
>                if (err < 0) {
>                        perror("read");
>                        exit(EXIT_FAILURE);
>                }
>                if ((limit % 10) == 0)
>                        fprintf(stdout, "(%d) \n", getpid());
>        }
>
>        fprintf(stdout, "%d: Received 10000 packets\n", getpid());
>
>        close(fd);
>        exit(0);
> }
>
> int main(int argc, char **argp)
> {
>        int fd, err;
>        int i;
>
>        if (argc != 3) {
>                fprintf(stderr, "Usage: %s INTERFACE {hash|lb}\n", argp[0]);
>                return EXIT_FAILURE;
>        }
>
>        if (!strcmp(argp[2], "hash"))
>                fanout_type = PACKET_FANOUT_HASH;
>        else if (!strcmp(argp[2], "lb"))
>                fanout_type = PACKET_FANOUT_LB;
>        else {
>                fprintf(stderr, "Unknown fanout type [%s]\n", argp[2]);
>                exit(EXIT_FAILURE);
>        }
>
>        device_name = argp[1];
>        fanout_id = getpid() & 0xffff;
>
>        for (i = 0; i < 4; i++) {
>                pid_t pid = fork();
>
>                switch (pid) {
>                case 0:
>                        fanout_thread();
>
>                case -1:
>                        perror("fork");
>                        exit(EXIT_FAILURE);
>                }
>        }
>
>        for (i = 0; i < 4; i++) {
>                int status;
>
>                wait(&status);
>        }
>
>        return 0;
> }
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux - Powered by OpenVZ