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

Reply via email to