Tritium I thought you were using rss rehash, the cluster has already the 5-tuple hashing mode that is ignoring the VLAN (please update from svn as it contains a fix for this). Instead to change the rss rehash you need to patch the default_rehash_rss_func function.
Regards Alfredo On Sep 14, 2012, at 5:50 AM, Tritium Cat <[email protected]> wrote: > > On Thu, Sep 13, 2012 at 2:47 PM, Alfredo Cardigliano <[email protected]> > wrote: > > > I would prefer the 802.1Q tags are ignored. > > This is not available through the API at the moment, you should manually > change the > hash function (hash_pkt_cluster) in kernel/pf_ring.c > > > I made it work by avoiding assignment in parse_raw_pkt() instead. I think > this might break filtering; I tried modifying hash_pkt_cluster as you > suggested but was unsuccessful. Can you point out what I'm missing ? Both > patches are included at the end. > > > hash_pkt_cluster --> hash_pkt_header() --> hash_pkt() > > According to hash_pkt_header() the last argument "mask_vlan" will prevent > using a vlan_id by providing "0" as an argument to hash_pkt() instead of the > parsed vlan_id obtained from parse_raw_pkt(). > > > ########################################## > # Inside hash_pkt_cluster(), call hash_pkt_header() > # with last argument as 1 to mask vlan. > ########################################## > # > idx = hash_pkt_header(hdr, 0, 0, 0, 0, 1); // last arg is to mask_vlan, > default 0. > > > > ########################################### > # Inside hash_pkt_header, call hash_pkt() with first argument as vlan_id. > # If mask_vlan was set then supply 0 instead of the parsed vlan_id. > ########################################### > # > -------------------------------------- > inline u_int32_t hash_pkt_header(struct pfring_pkthdr * hdr, u_char mask_src, > u_char mask_dst, > u_int8_t mask_port, u_int8_t mask_proto, > u_int8_t mask_vlan) > { > if(hdr->extended_hdr.pkt_hash == 0) { > u_int8_t use_tunneled_peers = > hdr->extended_hdr.parsed_pkt.tunnel.tunnel_id == NO_TUNNEL_ID ? 0 : 1; > > hdr->extended_hdr.pkt_hash = hash_pkt( > mask_vlan ? 0 : hdr->extended_hdr.parsed_pkt.vlan_id, // <--- supply > zero as vlan_id to hash_pkt() > --------------------------------------- > > > ########################################## > # inside hash_pkt(), > ########################################## > # > -------------------------------------- > inline u_int32_t hash_pkt(u_int16_t vlan_id, u_int8_t proto, > ip_addr host_peer_a, ip_addr host_peer_b, > u_int16_t port_peer_a, u_int16_t port_peer_b) > { > if(unlikely(enable_debug)) > printk("[PF_RING] hash_pkt(vlan_id=%u, proto=%u, port_peer_a=%u, > port_peer_b=%u)\n", > vlan_id,proto, port_peer_a, port_peer_b); > > return(vlan_id+proto+ > host_peer_a.v6.s6_addr32[0]+host_peer_a.v6.s6_addr32[1]+ > host_peer_a.v6.s6_addr32[2]+host_peer_a.v6.s6_addr32[3]+ > host_peer_b.v6.s6_addr32[0]+host_peer_b.v6.s6_addr32[1]+ > host_peer_b.v6.s6_addr32[2]+host_peer_b.v6.s6_addr32[3]+ > port_peer_a+port_peer_b); > } > -------------------------------------- > > > > > > > ############################################### > # > # Patch to prevent vlan_id by modifying parse_raw_pkt > # > ############################################### > # > --- pf_ring.c.svn-original 2012-09-13 15:20:08.968686143 -0700 > +++ pf_ring.c 2012-09-13 15:26:55.864690537 -0700 > @@ -330,6 +330,7 @@ > static unsigned int quick_mode = 0; > static unsigned int enable_debug = 0; > static unsigned int transparent_mode = standard_linux_path; > +static unsigned int disable_vlan_hash = 0; // disable hashing with vlanid > static atomic_t ring_id_serial = ATOMIC_INIT(0); > > #if defined(RHEL_RELEASE_CODE) > @@ -342,6 +343,7 @@ > module_param(min_num_slots, uint, 0644); > module_param(perfect_rules_hash_size, uint, 0644); > module_param(transparent_mode, uint, 0644); > +module_param(disable_vlan_hash, uint, 0644); // disable hashing with vlanid > module_param(enable_debug, uint, 0644); > module_param(enable_tx_capture, uint, 0644); > module_param(enable_ip_defrag, uint, 0644); > @@ -350,6 +352,7 @@ > MODULE_PARM(min_num_slots, "i"); > MODULE_PARM(perfect_rules_hash_size, "i"); > MODULE_PARM(transparent_mode, "i"); > +MODULE_PARM(disable_vlan_hash, "i"); // disable hashing with vlanid > MODULE_PARM(enable_debug, "i"); > MODULE_PARM(enable_tx_capture, "i"); > MODULE_PARM(enable_ip_defrag, "i"); > @@ -361,6 +364,8 @@ > MODULE_PARM_DESC(transparent_mode, > "0=standard Linux, 1=direct2pfring+transparent, 2=direct2pfring+non > transparent" > "For 1 and 2 you need to use a PF_RING aware driver"); > +MODULE_PARM_DESC(disable_vlan_hash, > + "0=include vlan_id, 1=ignore vlan_id. To ignore the vlan_id > when hashing by flow."); > MODULE_PARM_DESC(enable_debug, "Set to 1 to enable PF_RING debug tracing > into the syslog"); > MODULE_PARM_DESC(enable_tx_capture, "Set to 1 to capture outgoing packets"); > MODULE_PARM_DESC(enable_ip_defrag, > @@ -1332,6 +1337,8 @@ > rlen += sprintf(buf + rlen, "Transparent mode : %s\n", > (transparent_mode == standard_linux_path ? "Yes (mode 0)" : > (transparent_mode == driver2pf_ring_transparent ? "Yes (mode 1)" : "No > (mode 2)"))); > + rlen += sprintf(buf + rlen, "VLAN_ID in flow hash: %s\n", > + disable_vlan_hash ? "Disabled" : "Enabled"); > rlen += sprintf(buf + rlen, "Total rings : %d\n", > ring_table_size); > rlen += sprintf(buf + rlen, "Total plugins : %d\n", > plugin_registration_size); > } else { > @@ -1796,7 +1803,12 @@ > while (hdr->extended_hdr.parsed_pkt.eth_type == ETH_P_8021Q /* 802.1q > (VLAN) */) { > hdr->extended_hdr.parsed_pkt.offset.vlan_offset += sizeof(struct > eth_vlan_hdr); > vh = (struct eth_vlan_hdr *) > &data[hdr->extended_hdr.parsed_pkt.offset.vlan_offset]; > - hdr->extended_hdr.parsed_pkt.vlan_id = ntohs(vh->h_vlan_id) & 0x0fff; > + > + // If the disable_vlan_hash flag is set ignore the VLAN ID. > + if ( disable_vlan_hash == 0 ) { > + hdr->extended_hdr.parsed_pkt.vlan_id = ntohs(vh->h_vlan_id) & > 0x0fff; > + } > + > hdr->extended_hdr.parsed_pkt.eth_type = ntohs(vh->h_proto); > displ += sizeof(struct eth_vlan_hdr); > } > > > > > > > > ############################################ > # > # Unsuccessful attempt to patch by modifying hash_pkt_cluster. > # Modify last argument of hash_pkt_header to enable masking vlan_id. > # > ############################################ > # > --- pfring_svn-2012-09-14/kernel/pf_ring.c 2012-09-13 18:06:52.942351274 > -0700 > +++ pfring_svn-2012-09-14--vlan_patch/kernel/pf_ring.c 2012-09-13 > 18:04:07.002349484 -0700 > @@ -330,6 +330,7 @@ > static unsigned int quick_mode = 0; > static unsigned int enable_debug = 0; > static unsigned int transparent_mode = standard_linux_path; > +static unsigned int disable_vlan_hash = 0; > static atomic_t ring_id_serial = ATOMIC_INIT(0); > > #if defined(RHEL_RELEASE_CODE) > @@ -342,6 +343,7 @@ > module_param(min_num_slots, uint, 0644); > module_param(perfect_rules_hash_size, uint, 0644); > module_param(transparent_mode, uint, 0644); > +module_param(disable_vlan_hash, uint, 0644); > module_param(enable_debug, uint, 0644); > module_param(enable_tx_capture, uint, 0644); > module_param(enable_ip_defrag, uint, 0644); > @@ -350,6 +352,7 @@ > MODULE_PARM(min_num_slots, "i"); > MODULE_PARM(perfect_rules_hash_size, "i"); > MODULE_PARM(transparent_mode, "i"); > +MODULE_PARM(disable_vlan_hash, "i"); > MODULE_PARM(enable_debug, "i"); > MODULE_PARM(enable_tx_capture, "i"); > MODULE_PARM(enable_ip_defrag, "i"); > @@ -361,6 +364,8 @@ > MODULE_PARM_DESC(transparent_mode, > "0=standard Linux, 1=direct2pfring+transparent, > 2=direct2pfring+non transparent" > "For 1 and 2 you need to use a PF_RING aware driver"); > +MODULE_PARM_DESC(disable_vlan_hash, > + "0=Include VLAN_ID in load-balancing hash function, 1=Disable > VLAN_ID"); > MODULE_PARM_DESC(enable_debug, "Set to 1 to enable PF_RING debug tracing > into the syslog"); > MODULE_PARM_DESC(enable_tx_capture, "Set to 1 to capture outgoing packets"); > MODULE_PARM_DESC(enable_ip_defrag, > @@ -1332,6 +1337,8 @@ > rlen += sprintf(buf + rlen, "Transparent mode : %s\n", > (transparent_mode == standard_linux_path ? "Yes (mode 0)" > : > (transparent_mode == driver2pf_ring_transparent ? "Yes > (mode 1)" : "No (mode 2)"))); > + rlen += sprintf(buf + rlen, "VLAN_ID in hash : %s\n", > + (disable_vlan_hash ? "No" : "Yes")); > rlen += sprintf(buf + rlen, "Total rings : %d\n", > ring_table_size); > rlen += sprintf(buf + rlen, "Total plugins : %d\n", > plugin_registration_size); > } else { > @@ -3897,26 +3904,63 @@ > break; > > case cluster_per_flow_2_tuple: > - idx = hash_pkt_header(hdr, 0, 0, 1, 1, 0); > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 1, 1, 1) ) > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 1, 1, 0) ); > break; > > case cluster_per_flow_4_tuple: > - idx = hash_pkt_header(hdr, 0, 0, 0, 1, 0); > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 1, 1) ) > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 1, 0) ); > break; > > case cluster_per_flow_tcp_5_tuple: > if(((hdr->extended_hdr.parsed_pkt.tunnel.tunnel_id == NO_TUNNEL_ID) ? > hdr->extended_hdr.parsed_pkt.l3_proto : > hdr->extended_hdr.parsed_pkt.tunnel.tunneled_proto) == IPPROTO_TCP) > - idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0); /* 5 tuple */ > + > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 1) ) /* 5 tuple */ > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0) ); /* "5 tuple" by > VLAN_ID */ > else > - idx = hash_pkt_header(hdr, 0, 0, 1, 1, 0); /* 2 tuple */ > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 1, 1, 1) ) /* 2 tuple */ > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 1, 1, 0) ); /* "2 tuple" by > VLAN_ID */ > break; > > - case cluster_per_flow: > - case cluster_per_flow_5_tuple: > - default: > - idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0); > - break; > + case cluster_per_flow: > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 1) ) > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0) ); > + break; > + > + case cluster_per_flow_5_tuple: > + // If flag is set, mask the VLAN_ID from hashing > + disable_vlan_hash > + ? > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 1) ) > + : > + ( idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0) ); > + break; > + > + default: > + idx = hash_pkt_header(hdr, 0, 0, 0, 0, 0); > + break; > } > > return(idx % cluster_ptr->cluster.num_cluster_elements); > @@ -8652,6 +8696,8 @@ > enable_tx_capture ? "Yes [RX+TX]" : "No [RX only]"); > printk("[PF_RING] Transparent Mode %d\n", > transparent_mode); > + printk("[PF_RING] Ignore VLAN_IDs %d\n", > + disable_vlan_hash); > printk("[PF_RING] IP Defragment %s\n", > enable_ip_defrag ? "Yes" : "No"); > printk("[PF_RING] Initialized correctly\n"); > > > _______________________________________________ > Ntop-misc mailing list > [email protected] > http://listgateway.unipi.it/mailman/listinfo/ntop-misc
_______________________________________________ Ntop-misc mailing list [email protected] http://listgateway.unipi.it/mailman/listinfo/ntop-misc
