On 2015-04-11 at 18:59:08 +0200, Michał Purzyński <[email protected]> 
wrote:
> OK, try one. I'm ready to accept heavy artillery fire ;-) Man, it
> takes a while to find a free letter for getopt.
> 
> 
> Two new parameters were added:
> -C <cluster id> with integer that represents the socket fanout group
> identifier and must be shared between all processes in the group
> -K hash/lb/cpu/rnd - the type of fanout. The only really useful here
> is "hash" because it preserves flows. If it is choosen, kernel side
> defragmentation is enabled as well (fragments would have different
> hash).
> 
> Now, kernel does not allow to choose what we are hashing on, and it
> seems to be 4-tuple.
> 
> I tested it with lb and hash cluster types and everything worked. The
> lb cluster type is useless (as is anything that is not "hash" but
> given how advanced the nesniff-ng software is, someone might find it
> useful and it's just a few lines more.
> 
> Patch is below (inline, for comments).

The patch looks line-wrapped and has tabs converted to spaces. Could you
please resend it without these changes? Usually this is due to the mail
agent line-wrapping even pasted text. I'd suggest to use `git
send-email' which will generate a proper patch e-mail which can directly
be reviewed and applied. Care to retry?

(Therefor I did not review the patch content-wise yet)

Thanks
Tobias

> 
> diff -uprN netsniff-ng/netsniff-ng.c
> netsniff-ng-multiprocess-clean/netsniff-ng.c
> --- netsniff-ng/netsniff-ng.c 2015-04-11 18:48:19.861108673 +0200
> +++ netsniff-ng-multiprocess-clean/netsniff-ng.c 2015-04-11
> 18:51:01.286156858 +0200
> @@ -60,12 +60,13 @@ struct ctx {
>   bool randomize, promiscuous, enforce, jumbo, dump_bpf, hwtimestamp, verbose;
>   enum pcap_ops_groups pcap; enum dump_mode dump_mode;
>   uid_t uid; gid_t gid; uint32_t link_type, magic;
> +    uint32_t cluster_id, cluster_type;
>  };
> 
>  static volatile sig_atomic_t sigint = 0;
>  static volatile bool next_dump = false;
> 
> -static const char *short_options =
> "d:i:o:rf:MNJt:S:k:n:b:HQmcsqXlvhF:RGAP:Vu:g:T:DBU";
> +static const char *short_options =
> "d:i:o:rf:MNJt:S:k:n:b:HQmcsqXlvhF:RGAP:Vu:g:T:DBU:C:K:";
>  static const struct option long_options[] = {
>   {"dev", required_argument, NULL, 'd'},
>   {"in", required_argument, NULL, 'i'},
> @@ -81,6 +82,8 @@ static const struct option long_options[
>   {"user", required_argument, NULL, 'u'},
>   {"group", required_argument, NULL, 'g'},
>   {"magic", required_argument, NULL, 'T'},
> + {"cluster-id",  required_argument, NULL, 'C'},
> + {"cluster-type",    required_argument, NULL, 'K'},
>   {"rand", no_argument, NULL, 'r'},
>   {"rfraw", no_argument, NULL, 'R'},
>   {"mmap", no_argument, NULL, 'm'},
> @@ -376,7 +379,7 @@ static void receive_to_xmit(struct ctx *
>   bpf_dump_all(&bpf_ops);
>   bpf_attach_to_sock(rx_sock, &bpf_ops);
> 
> - ring_rx_setup(&rx_ring, rx_sock, size_in, ifindex_in, &rx_poll,
> false, ctx->jumbo, ctx->verbose);
> + ring_rx_setup(&rx_ring, rx_sock, size_in, ifindex_in, &rx_poll,
> false, ctx->jumbo, ctx->verbose, ctx->cluster_id, ctx->cluster_type);
>   ring_tx_setup(&tx_ring, tx_sock, size_out, ifindex_out, ctx->jumbo,
> ctx->verbose);
> 
>   dissector_init_all(ctx->print_mode);
> @@ -932,7 +935,7 @@ static void recv_only_or_dump(struct ctx
>   printf("HW timestamping enabled\n");
>   }
> 
> - ring_rx_setup(&rx_ring, sock, size, ifindex, &rx_poll,
> is_defined(HAVE_TPACKET3), true, ctx->verbose);
> + ring_rx_setup(&rx_ring, sock, size, ifindex, &rx_poll,
> is_defined(HAVE_TPACKET3), true, ctx->verbose, ctx->cluster_id,
> ctx->cluster_type);
> 
>   dissector_init_all(ctx->print_mode);
> 
> @@ -1366,6 +1369,23 @@ int main(int argc, char **argv)
>   case 'h':
>   help();
>   break;
> +        case 'C':
> +            ctx.cluster_id = (uint32_t) strtoul(optarg, NULL, 0);
> +            break;
> +        case 'K':
> +            if (!strncmp(optarg, "hash", strlen("hash")))
> +                ctx.cluster_type = PACKET_FANOUT_HASH;
> +            else if (!strncmp(optarg, "lb", strlen("lb")))
> +                ctx.cluster_type = PACKET_FANOUT_LB;
> +            else if (!strncmp(optarg, "cpu", strlen("cpu")))
> +                ctx.cluster_type = PACKET_FANOUT_CPU;
> +            else if (!strncmp(optarg, "rnd", strlen("rnd")))
> +                ctx.cluster_type = PACKET_FANOUT_RND;
> +            else if (!strncmp(optarg, "rollover", strlen("rollover")))
> +                ctx.cluster_type = PACKET_FANOUT_ROLLOVER;
> +/*            else if (!strncmp(optarg, "qm", strlen("qm")))
> +                ctx.cluster_type = PACKET_FANOUT_QM;*/
> +            break;
>   case '?':
>   switch (optopt) {
>   case 'd':
> diff -uprN netsniff-ng/ring_rx.c netsniff-ng-multiprocess-clean/ring_rx.c
> --- netsniff-ng/ring_rx.c 2015-04-11 18:48:19.877111409 +0200
> +++ netsniff-ng-multiprocess-clean/ring_rx.c 2015-04-11 18:50:50.661402061 
> +0200
> @@ -209,9 +209,23 @@ static void alloc_rx_ring_frames(int soc
>    rx_ring_get_size(ring, v3));
>  }
> 
> +void create_cluster(int sock, uint32_t cluster_id, uint32_t cluster_mode)
> +{
> +    uint32_t cluster_option = 0;
> +    int ret = 0;
> +
> +    if (cluster_mode == PACKET_FANOUT_HASH)
> +        cluster_mode = PACKET_FANOUT_HASH | PACKET_FANOUT_FLAG_DEFRAG;
> +    else
> +        cluster_option = (cluster_id | (cluster_mode << 16));
> +    ret = setsockopt(sock, SOL_PACKET, PACKET_FANOUT,(void
> *)&cluster_option, sizeof(cluster_option));
> +    if (ret < 0)
> +        panic("Cannot set fanout ring mode!\n");
> +}
> +
>  void ring_rx_setup(struct ring *ring, int sock, size_t size, int ifindex,
>     struct pollfd *poll, bool v3, bool jumbo_support,
> -   bool verbose)
> +   bool verbose, uint32_t cluster_id, uint32_t cluster_type)
>  {
>   fmemset(ring, 0, sizeof(*ring));
>   setup_rx_ring_layout(sock, ring, size, jumbo_support, v3);
> @@ -220,6 +234,7 @@ void ring_rx_setup(struct ring *ring, in
>   alloc_rx_ring_frames(sock, ring);
>   bind_ring_generic(sock, ring, ifindex, false);
>   prepare_polling(sock, poll);
> +    create_cluster(sock, cluster_id, cluster_type);
>  }
> 
>  void sock_rx_net_stats(int sock, unsigned long seen)
> diff -uprN netsniff-ng/ring_rx.h netsniff-ng-multiprocess-clean/ring_rx.h
> --- netsniff-ng/ring_rx.h 2015-04-11 18:48:19.877111409 +0200
> +++ netsniff-ng-multiprocess-clean/ring_rx.h 2015-04-11 18:50:50.661402061 
> +0200
> @@ -13,7 +13,7 @@
> 
>  extern void ring_rx_setup(struct ring *ring, int sock, size_t size,
> int ifindex,
>    struct pollfd *poll, bool v3, bool jumbo_support,
> -  bool verbose);
> +  bool verbose, uint32_t cluster_id, uint32_t cluster_type);
>  extern void destroy_rx_ring(int sock, struct ring *ring);
>  extern void sock_rx_net_stats(int sock, unsigned long seen);
> 
> 
> 
> On Fri, Apr 10, 2015 at 10:31 PM, Jon Schipp <[email protected]> wrote:
> > Awesome, glad to see this coming up again :)
> >
> > On Wed, Apr 8, 2015 at 6:43 AM, Daniel Borkmann <[email protected]>
> > wrote:
> >>
> >> On 04/07/2015 04:34 PM, Daniel Borkmann wrote:
> >>>
> >>> On 04/07/2015 04:28 PM, Michał Purzyński wrote:
> >>>>
> >>>> So the crash was caused by a real OOM condition, I was testing it in a
> >>>> VM with 512MB RAM. Changed to 4GB and now I have two netsniff-ng
> >>>> instances working and getting portion of the flows, hashed by the
> >>>> kernel, per flow :-)
> >>>>
> >>>> I will work on the code and submit patches for review in a few days.
> >>>
> >>>
> >>> Ok, great, looking forward!
> >>
> >>
> >> I think you might also want to let the user choose which fanout
> >> discipline to use in kernel side. There are several useful ones
> >> available.
> >>
> >>
> >> --
> >> You received this message because you are subscribed to the Google Groups
> >> "netsniff-ng" 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.
> >
> >
> >
> >
> > --
> > Jon Schipp,
> > jonschipp.com, sickbits.net, opennsm.ncsa.illinois.edu
> 

-- 
You received this message because you are subscribed to the Google Groups 
"netsniff-ng" 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