lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
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