Hi Konstantin,

> -----Original Message-----
> From: Ananyev, Konstantin
> Sent: Wednesday, October 21, 2015 6:19 PM
> To: Lu, Wenzhuo; dev at dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2 6/6] ixgbe: implementation for fdir new
> modes' config
> 
> 
> 
> > -----Original Message-----
> > From: Lu, Wenzhuo
> > Sent: Wednesday, October 21, 2015 2:48 AM
> > To: Ananyev, Konstantin; dev at dpdk.org
> > Subject: RE: [dpdk-dev] [PATCH v2 6/6] ixgbe: implementation for fdir
> > new modes' config
> >
> > Hi Konstantin,
> >
> > > -----Original Message-----
> > > From: Ananyev, Konstantin
> > > Sent: Tuesday, October 20, 2015 9:56 PM
> > > To: Lu, Wenzhuo; dev at dpdk.org
> > > Subject: RE: [dpdk-dev] [PATCH v2 6/6] ixgbe: implementation for
> > > fdir new modes' config
> > >
> > > Hi Wenzhuo,
> > > Few questions/comments from me, see below.
> > > Thanks
> > > Konstantin
> > >
> > > > -----Original Message-----
> > > > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Wenzhuo Lu
> > > > Sent: Tuesday, September 29, 2015 6:31 AM
> > > > To: dev at dpdk.org
> > > > Subject: [dpdk-dev] [PATCH v2 6/6] ixgbe: implementation for fdir
> > > > new modes' config
> > > >
> > > > Implement the new CLIs for fdir mac vlan and tunnel modes,
> > > > including flow_director_filter and flow_director_mask. Set the mask of
> fdir.
> > > > Add, delete or update the entities of filter.
> > > >
> > > > Signed-off-by: Wenzhuo Lu <wenzhuo.lu at intel.com>
> > > > ---
> > > >  drivers/net/ixgbe/ixgbe_ethdev.h |   3 +
> > > >  drivers/net/ixgbe/ixgbe_fdir.c   | 241
> > > ++++++++++++++++++++++++++++++++-------
> > > >  2 files changed, 202 insertions(+), 42 deletions(-)
> > > >
> > > > diff --git a/drivers/net/ixgbe/ixgbe_ethdev.h
> > > > b/drivers/net/ixgbe/ixgbe_ethdev.h
> > > > index c3d4f4f..9cc45a0 100644
> > > > --- a/drivers/net/ixgbe/ixgbe_ethdev.h
> > > > +++ b/drivers/net/ixgbe/ixgbe_ethdev.h
> > > > @@ -133,6 +133,9 @@ struct ixgbe_hw_fdir_mask {
> > > >         uint16_t src_port_mask;
> > > >         uint16_t dst_port_mask;
> > > >         uint16_t flex_bytes_mask;
> > > > +       uint8_t  mac_addr_mask;
> > > > +       uint32_t tunnel_id_mask;
> > > > +       uint8_t  tunnel_type_mask;
> > > >  };
> > > >
> > > >  struct ixgbe_hw_fdir_info {
> > > > diff --git a/drivers/net/ixgbe/ixgbe_fdir.c
> > > > b/drivers/net/ixgbe/ixgbe_fdir.c index 5c8b833..87e7081 100644
> > > > --- a/drivers/net/ixgbe/ixgbe_fdir.c
> > > > +++ b/drivers/net/ixgbe/ixgbe_fdir.c
> > > > @@ -105,6 +105,8 @@
> > > >         rte_memcpy((ipaddr), ipv6_addr, sizeof(ipv6_addr));\  } while
> > > > (0)
> > > >
> > > > +#define DEFAULT_VXLAN_PORT 4789
> > > > +
> > > >  static int fdir_erase_filter_82599(struct ixgbe_hw *hw, uint32_t
> > > > fdirhash);  static int fdir_set_input_mask_82599(struct rte_eth_dev
> *dev,
> > > >                 const struct rte_eth_fdir_masks *input_mask); @@ -113,7
> > > +115,8 @@
> > > > static int ixgbe_set_fdir_flex_conf(struct rte_eth_dev *dev,
> > > > static int fdir_enable_82599(struct ixgbe_hw *hw, uint32_t
> > > > fdirctrl);  static int ixgbe_fdir_filter_to_atr_input(
> > > >                 const struct rte_eth_fdir_filter *fdir_filter,
> > > > -               union ixgbe_atr_input *input);
> > > > +               union ixgbe_atr_input *input,
> > > > +               enum rte_fdir_mode mode);
> > > >  static uint32_t ixgbe_atr_compute_hash_82599(union
> > > > ixgbe_atr_input
> > > *atr_input,
> > > >                                  uint32_t key);
> > > >  static uint32_t atr_compute_sig_hash_82599(union ixgbe_atr_input
> > > > *input, @@ -122,7 +125,8 @@ static uint32_t
> > > atr_compute_perfect_hash_82599(union ixgbe_atr_input *input,
> > > >                 enum rte_fdir_pballoc_type pballoc);  static int
> > > > fdir_write_perfect_filter_82599(struct ixgbe_hw *hw,
> > > >                         union ixgbe_atr_input *input, uint8_t queue,
> > > > -                       uint32_t fdircmd, uint32_t fdirhash);
> > > > +                       uint32_t fdircmd, uint32_t fdirhash,
> > > > +                       enum rte_fdir_mode mode);
> > > >  static int fdir_add_signature_filter_82599(struct ixgbe_hw *hw,
> > > >                 union ixgbe_atr_input *input, u8 queue, uint32_t 
> > > > fdircmd,
> > > >                 uint32_t fdirhash);
> > > > @@ -243,9 +247,15 @@ configure_fdir_flags(const struct
> > > > rte_fdir_conf
> > > *conf, uint32_t *fdirctrl)
> > > >         *fdirctrl |= (IXGBE_DEFAULT_FLEXBYTES_OFFSET / sizeof(uint16_t))
> > > <<
> > > >                      IXGBE_FDIRCTRL_FLEX_SHIFT;
> > > >
> > > > -       if (conf->mode == RTE_FDIR_MODE_PERFECT) {
> > > > +       if (conf->mode >= RTE_FDIR_MODE_PERFECT) {
> > >
> > > I think better  if (conf->mode >= RTE_FDIR_MODE_PERFECT  &&
> > > conf->mode <= RTE_FDIR_MODE_PERFECT_TUNNEL) To make sure that
> future
> > > expansion of RTE_FDIR_MODE_* wouldn't break that code.
> > Yes, you're right. I'll change it.
> >
> > >
> > > >                 *fdirctrl |= IXGBE_FDIRCTRL_PERFECT_MATCH;
> > > >                 *fdirctrl |= (conf->drop_queue <<
> > > IXGBE_FDIRCTRL_DROP_Q_SHIFT);
> > > > +               if (conf->mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN)
> > > > +                       *fdirctrl |= (IXGBE_FDIRCTRL_FILTERMODE_MACVLAN
> > > > +                                       <<
> > > IXGBE_FDIRCTRL_FILTERMODE_SHIFT);
> > > > +               else if (conf->mode == RTE_FDIR_MODE_PERFECT_TUNNEL)
> > > > +                       *fdirctrl |= (IXGBE_FDIRCTRL_FILTERMODE_CLOUD
> > > > +                                       <<
> > > IXGBE_FDIRCTRL_FILTERMODE_SHIFT);
> > > >         }
> > > >
> > > >         return 0;
> > > > @@ -294,8 +304,18 @@ fdir_set_input_mask_82599(struct rte_eth_dev
> > > *dev,
> > > >         uint16_t dst_ipv6m = 0;
> > > >         uint16_t src_ipv6m = 0;
> > > >
> > > > +       enum rte_fdir_mode mode = dev->data->dev_conf.fdir_conf.mode;
> > > > +
> > > >         PMD_INIT_FUNC_TRACE();
> > > >
> > > > +       /* set the default UDP port for VxLAN */
> > > > +       IXGBE_WRITE_REG(hw, IXGBE_VXLANCTRL, DEFAULT_VXLAN_PORT);
> > >
> > > Hmm, why is that done by default?
> > > As I understand it is x550 specific register and is not present in
> > > older HW (82599), no?
> > Yes, the older HW doesn't support VxLAN. I'll correct it.
> >
> > >
> > > > +
> > > > +       /* some bits must be set for mac vlan or tunnel mode */
> > > > +       if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN
> > > > +               || mode == RTE_FDIR_MODE_PERFECT_TUNNEL)
> > > > +               fdirm |= IXGBE_FDIRM_L4P | IXGBE_FDIRM_L3P;
> > > > +
> > > >         /*
> > > >          * Program the relevant mask registers.  If src/dst_port or
> > > src/dst_addr
> > > >          * are zero, then assume a full mask for that field. Also assume
> > > > that @@ -323,26 +343,36 @@ fdir_set_input_mask_82599(struct
> > > > rte_eth_dev *dev,
> > > >
> > > >         IXGBE_WRITE_REG(hw, IXGBE_FDIRM, fdirm);
> > > >
> > > > -       /* store the TCP/UDP port masks, bit reversed from port layout 
> > > > */
> > > > -       fdirtcpm = reverse_fdir_bitmasks(input_mask->dst_port_mask,
> > > > -                                        input_mask->src_port_mask);
> > > > -
> > > > -       /* write all the same so that UDP, TCP and SCTP use the same 
> > > > mask
> > > */
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, ~fdirtcpm);
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, ~fdirtcpm);
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, ~fdirtcpm);
> > > > -       info->mask.src_port_mask = input_mask->src_port_mask;
> > > > -       info->mask.dst_port_mask = input_mask->dst_port_mask;
> > > > +       if (mode != RTE_FDIR_MODE_PERFECT_MAC_VLAN &&
> > > > +               mode != RTE_FDIR_MODE_PERFECT_TUNNEL) {
> > > > +               /*
> > > > +                * store the TCP/UDP port masks,
> > > > +                * bit reversed from port layout
> > > > +                */
> > > > +               fdirtcpm = reverse_fdir_bitmasks(input_mask-
> > > >dst_port_mask,
> > > > +                                                
> > > > input_mask->src_port_mask);
> > > >
> > > > -       /* Store source and destination IPv4 masks (big-endian) */
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIP4M, ~(input_mask-
> > > >ipv4_mask.src_ip));
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRDIP4M, ~(input_mask-
> > > >ipv4_mask.dst_ip));
> > > > -       info->mask.src_ipv4_mask = input_mask->ipv4_mask.src_ip;
> > > > -       info->mask.dst_ipv4_mask = input_mask->ipv4_mask.dst_ip;
> > > > +               /*
> > > > +                * write all the same so that UDP,
> > > > +                * TCP and SCTP use the same mask
> > > > +                */
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, ~fdirtcpm);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, ~fdirtcpm);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, ~fdirtcpm);
> > > > +               info->mask.src_port_mask = input_mask->src_port_mask;
> > > > +               info->mask.dst_port_mask = input_mask->dst_port_mask;
> > > > +
> > > > +               /* Store source and destination IPv4 masks (big-endian) 
> > > > */
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRSIP4M,
> > > > +                               ~(input_mask->ipv4_mask.src_ip));
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRDIP4M,
> > > > +                               ~(input_mask->ipv4_mask.dst_ip));
> > > > +               info->mask.src_ipv4_mask = input_mask->ipv4_mask.src_ip;
> > > > +               info->mask.dst_ipv4_mask = input_mask->ipv4_mask.dst_ip;
> > > > +       }
> > > >
> > > > -       if (dev->data->dev_conf.fdir_conf.mode ==
> > > RTE_FDIR_MODE_SIGNATURE) {
> > > > +       if (mode == RTE_FDIR_MODE_SIGNATURE) {
> > > >                 /*
> > > > -                * IPv6 mask is only meaningful in signature mode
> > > >                  * Store source and destination IPv6 masks (bit 
> > > > reversed)
> > > >                  */
> > > >                 IPV6_ADDR_TO_MASK(input_mask->ipv6_mask.src_ip,
> > > src_ipv6m); @@
> > > > -354,6 +384,69 @@ fdir_set_input_mask_82599(struct rte_eth_dev
> *dev,
> > > >                 info->mask.dst_ipv6_mask = dst_ipv6m;
> > > >         }
> > > >
> > > > +       if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN
> > > > +               || mode == RTE_FDIR_MODE_PERFECT_TUNNEL) {
> > > > +               fdiripv6m = ((u32) 0xFFFFU << 
> > > > IXGBE_FDIRIP6M_DIPM_SHIFT);
> > > > +               fdiripv6m |= IXGBE_FDIRIP6M_ALWAYS_MASK;
> > > > +               if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN)
> > > > +                       fdiripv6m |= IXGBE_FDIRIP6M_TUNNEL_TYPE |
> > > > +                                       IXGBE_FDIRIP6M_TNI_VNI;
> > > > +
> > > > +               switch (input_mask->mac_addr_mask & 0xFF) {
> > > > +               case 0x00:
> > > > +                       /* Mask inner MAC */
> > > > +                       fdiripv6m |= IXGBE_FDIRIP6M_INNER_MAC;
> > > > +                       break;
> > > > +               case 0xFF:
> > > > +                       break;
> > > > +               default:
> > > > +                       PMD_INIT_LOG(ERR, "invalid mac_addr_mask");
> > > > +                       return -EINVAL;
> > >
> > > I thought it is possible to mask any byte in MAC...
> > > Am I missing something here?
> > Just leverage the behavior of kernel driver. It only supports 0x00 and 0xFF.
> 
> Ok, probably there is a case when we don't need to follow the kernel :) My
> take: let's support all masks properly.
OK. I'll remove this limitation.

> 
> >
> > >
> > > > +               }
> > > > +               info->mask.mac_addr_mask = input_mask->mac_addr_mask;
> > > > +
> > > > +               if (mode == RTE_FDIR_MODE_PERFECT_TUNNEL) {
> > > > +                       switch (input_mask->tunnel_type_mask) {
> > > > +                       case 0:
> > > > +                               /* Mask turnnel type */
> > > > +                               fdiripv6m |= IXGBE_FDIRIP6M_TUNNEL_TYPE;
> > > > +                               break;
> > > > +                       case 1:
> > > > +                               break;
> > > > +                       default:
> > > > +                               PMD_INIT_LOG(ERR, "invalid
> > > tunnel_type_mask");
> > > > +                               return -EINVAL;
> > > > +                       }
> > > > +                       info->mask.tunnel_type_mask =
> > > > +                               input_mask->tunnel_type_mask;
> > > > +
> > > > +                       switch (input_mask->tunnel_id_mask & 
> > > > 0xFFFFFFFF) {
> > > > +                       case 0x0:
> > > > +                               /* Mask vxlan id */
> > > > +                               fdiripv6m |= IXGBE_FDIRIP6M_TNI_VNI;
> > > > +                               break;
> > > > +                       case 0x00FFFFFF:
> > > > +                               fdiripv6m |= IXGBE_FDIRIP6M_TNI_VNI_24;
> > > > +                               break;
> > > > +                       case 0xFFFFFFFF:
> > > > +                               break;
> > > > +                       default:
> > > > +                               PMD_INIT_LOG(ERR, "invalid
> > > tunnel_id_mask");
> > > > +                               return -EINVAL;
> > > > +                       }
> > > > +                       info->mask.tunnel_id_mask =
> > > > +                               input_mask->tunnel_id_mask;
> > > > +               }
> > > > +
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRIP6M, fdiripv6m);
> > > > +
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, 0xFFFFFFFF);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, 0xFFFFFFFF);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, 0xFFFFFFFF);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRDIP4M, 0xFFFFFFFF);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRSIP4M, 0xFFFFFFFF);
> > > > +       }
> > >
> > > Probably worth to put into a separate function:
> > > fdir_set_input_mask_x550() or something.
> > O, seems this function is too long and complex. I'll split it.
> >
> > >
> > > > +
> > > >         return IXGBE_SUCCESS;
> > > >  }
> > > >
> > > > @@ -431,6 +524,7 @@ ixgbe_fdir_configure(struct rte_eth_dev *dev)
> > > >         int err;
> > > >         uint32_t fdirctrl, pbsize;
> > > >         int i;
> > > > +       enum rte_fdir_mode mode = dev->data->dev_conf.fdir_conf.mode;
> > > >
> > > >         PMD_INIT_FUNC_TRACE();
> > > >
> > > > @@ -440,6 +534,13 @@ ixgbe_fdir_configure(struct rte_eth_dev *dev)
> > > >                 hw->mac.type != ixgbe_mac_X550EM_x)
> > > >                 return -ENOSYS;
> > > >
> > > > +       /* x550 supports mac-vlan and tunnel mode but other NICs not */
> > > > +       if (hw->mac.type != ixgbe_mac_X550 &&
> > > > +               hw->mac.type != ixgbe_mac_X550EM_x &&
> > > > +               mode != RTE_FDIR_MODE_SIGNATURE &&
> > > > +               mode != RTE_FDIR_MODE_PERFECT)
> > > > +               return -ENOSYS;
> > > > +
> > > >         err = configure_fdir_flags(&dev->data->dev_conf.fdir_conf, 
> > > > &fdirctrl);
> > > >         if (err)
> > > >                 return err;
> > > > @@ -488,7 +589,7 @@ ixgbe_fdir_configure(struct rte_eth_dev *dev)
> > > >   */
> > > >  static int
> > > >  ixgbe_fdir_filter_to_atr_input(const struct rte_eth_fdir_filter
> *fdir_filter,
> > > > -               union ixgbe_atr_input *input)
> > > > +               union ixgbe_atr_input *input, enum rte_fdir_mode mode)
> > > >  {
> > > >         input->formatted.vlan_id = fdir_filter->input.flow_ext.vlan_tci;
> > > >         input->formatted.flex_bytes = (uint16_t)( @@ -521,8 +622,7 @@
> > > > ixgbe_fdir_filter_to_atr_input(const struct rte_eth_fdir_filter
> *fdir_filter,
> > > >                 input->formatted.flow_type = IXGBE_ATR_FLOW_TYPE_IPV6;
> > > >                 break;
> > > >         default:
> > > > -               PMD_DRV_LOG(ERR, " Error on flow_type input");
> > > > -               return -EINVAL;
> > > > +               break;
> > > >         }
> > > >
> > > >         switch (fdir_filter->input.flow_type) { @@ -558,8 +658,23 @@
> > > > ixgbe_fdir_filter_to_atr_input(const struct rte_eth_fdir_filter
> *fdir_filter,
> > > >                            sizeof(input->formatted.dst_ip));
> > > >                 break;
> > > >         default:
> > > > -               PMD_DRV_LOG(ERR, " Error on flow_type input");
> > > > -               return -EINVAL;
> > > > +               break;
> > > > +       }
> > > > +
> > > > +       if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
> > > > +               rte_memcpy(
> > > > +                       input->formatted.inner_mac,
> > > > +                       fdir_filter-
> > > >input.flow.mac_vlan_flow.mac_addr.addr_bytes,
> > > > +                       sizeof(input->formatted.inner_mac));
> > > > +       } else if (mode == RTE_FDIR_MODE_PERFECT_TUNNEL) {
> > > > +               rte_memcpy(
> > > > +                       input->formatted.inner_mac,
> > > > +                       fdir_filter-
> > > >input.flow.tunnel_flow.mac_addr.addr_bytes,
> > > > +                       sizeof(input->formatted.inner_mac));
> > > > +               input->formatted.tunnel_type =
> > > > +                       fdir_filter->input.flow.tunnel_flow.tunnel_type;
> > > > +               input->formatted.tni_vni =
> > > > +                       fdir_filter->input.flow.tunnel_flow.tunnel_id;
> > > >         }
> > > >
> > > >         return 0;
> > > > @@ -743,20 +858,51 @@ atr_compute_sig_hash_82599(union
> > > ixgbe_atr_input
> > > > *input,  static int  fdir_write_perfect_filter_82599(struct
> > > > ixgbe_hw *hw,
> > > >                         union ixgbe_atr_input *input, uint8_t queue,
> > > > -                       uint32_t fdircmd, uint32_t fdirhash)
> > > > +                       uint32_t fdircmd, uint32_t fdirhash,
> > > > +                       enum rte_fdir_mode mode)
> > > >  {
> > > >         uint32_t fdirport, fdirvlan;
> > > > +       u32 addr_low, addr_high;
> > > > +       u32 tunnel_type = 0;
> > > >         int err = 0;
> > > >
> > > > -       /* record the IPv4 address (big-endian) */
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA, input->formatted.src_ip[0]);
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRIPDA, input->formatted.dst_ip[0]);
> > > > -
> > > > -       /* record source and destination port (little-endian)*/
> > > > -       fdirport = IXGBE_NTOHS(input->formatted.dst_port);
> > > > -       fdirport <<= IXGBE_FDIRPORT_DESTINATION_SHIFT;
> > > > -       fdirport |= IXGBE_NTOHS(input->formatted.src_port);
> > > > -       IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport);
> > > > +       if (mode == RTE_FDIR_MODE_PERFECT) {
> > > > +               /* record the IPv4 address (big-endian) */
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRIPSA,
> > > > +                               input->formatted.src_ip[0]);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRIPDA,
> > > > +                               input->formatted.dst_ip[0]);
> > > > +
> > > > +               /* record source and destination port (little-endian)*/
> > > > +               fdirport = IXGBE_NTOHS(input->formatted.dst_port);
> > > > +               fdirport <<= IXGBE_FDIRPORT_DESTINATION_SHIFT;
> > > > +               fdirport |= IXGBE_NTOHS(input->formatted.src_port);
> > > > +               IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport);
> > > > +       } else {
> > > else if (mode == MAC_VLAN || mode == TUNNEL)
> > >
> > > Again, to avoid breakage with future expansions.
> > Agree, I'll change it.
> >
> > >
> > > > +               /* for mac vlan and tunnel modes */
> > > > +               addr_low = ((u32)input->formatted.inner_mac[0] |
> > > > +                           ((u32)input->formatted.inner_mac[1] << 8) |
> > > > +                           ((u32)input->formatted.inner_mac[2] << 16) |
> > > > +                           ((u32)input->formatted.inner_mac[3] << 24));
> > > > +               addr_high = ((u32)input->formatted.inner_mac[4] |
> > > > +                            ((u32)input->formatted.inner_mac[5] << 8));
> > > > +
> > > > +               if (mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN) {
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(0),
> > > addr_low);
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(1),
> > > addr_high);
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2), 0);
> > > > +               } else {
> > > > +                       /* tunnel mode */
> > > > +                       if (input->formatted.tunnel_type !=
> > > > +                               RTE_FDIR_TUNNEL_TYPE_NVGRE)
> > > > +                               tunnel_type = 0x80000000;
> > > > +                       tunnel_type |= addr_high;
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(0),
> > > addr_low);
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(1),
> > > tunnel_type);
> > > > +                       IXGBE_WRITE_REG(hw, IXGBE_FDIRSIPv6(2),
> > > > +                                       input->formatted.tni_vni);
> > > > +               }
> > > > +       }
> > > >
> > > >         /* record vlan (little-endian) and flex_bytes(big-endian) */
> > > >         fdirvlan = input->formatted.flex_bytes; @@ -917,12 +1063,13 @@
> > > > ixgbe_add_del_fdir_filter(struct rte_eth_dev *dev,
> > > >                 return -ENOTSUP;
> > > >         }
> > > >
> > > > -       if (dev->data->dev_conf.fdir_conf.mode ==
> > > RTE_FDIR_MODE_PERFECT)
> > > > +       if (dev->data->dev_conf.fdir_conf.mode >=
> > > RTE_FDIR_MODE_PERFECT)
> > > >                 is_perfect = TRUE;
> > > >
> > > >         memset(&input, 0, sizeof(input));
> > > >
> > > > -       err = ixgbe_fdir_filter_to_atr_input(fdir_filter, &input);
> > > > +       err = ixgbe_fdir_filter_to_atr_input(fdir_filter, &input,
> > > > +                                       
> > > > dev->data->dev_conf.fdir_conf.mode);
> > > >         if (err)
> > > >                 return err;
> > > >
> > > > @@ -966,7 +1113,8 @@ ixgbe_add_del_fdir_filter(struct rte_eth_dev
> > > > *dev,
> > > >
> > > >         if (is_perfect) {
> > > >                 err = fdir_write_perfect_filter_82599(hw, &input, queue,
> > > > -                               fdircmd_flags, fdirhash);
> > > > +                               fdircmd_flags, fdirhash,
> > > > +                               dev->data->dev_conf.fdir_conf.mode);
> > > >         } else {
> > > >                 err = fdir_add_signature_filter_82599(hw, &input, queue,
> > > >                                 fdircmd_flags, fdirhash);
> > > > @@ -1018,7 +1166,7 @@ ixgbe_fdir_info_get(struct rte_eth_dev *dev,
> > > struct rte_eth_fdir_info *fdir_info
> > > >         fdir_info->mode = dev->data->dev_conf.fdir_conf.mode;
> > > >         max_num = (1 << (FDIRENTRIES_NUM_SHIFT +
> > > >                         (fdirctrl & FDIRCTRL_PBALLOC_MASK)));
> > > > -       if (fdir_info->mode == RTE_FDIR_MODE_PERFECT)
> > > > +       if (fdir_info->mode >= RTE_FDIR_MODE_PERFECT)
> > > >                 fdir_info->guarant_spc = max_num;
> > > >         else if (fdir_info->mode == RTE_FDIR_MODE_SIGNATURE)
> > > >                 fdir_info->guarant_spc = max_num * 4; @@ -1032,11
> > > +1180,20 @@
> > > > ixgbe_fdir_info_get(struct rte_eth_dev *dev, struct
> > > > rte_eth_fdir_info
> > > *fdir_info
> > > >                         fdir_info->mask.ipv6_mask.dst_ip);
> > > >         fdir_info->mask.src_port_mask = info->mask.src_port_mask;
> > > >         fdir_info->mask.dst_port_mask = info->mask.dst_port_mask;
> > > > +       fdir_info->mask.mac_addr_mask = info->mask.mac_addr_mask;
> > > > +       fdir_info->mask.tunnel_id_mask = info->mask.tunnel_id_mask;
> > > > +       fdir_info->mask.tunnel_type_mask = info->mask.tunnel_type_mask;
> > > >         fdir_info->max_flexpayload = IXGBE_FDIR_MAX_FLEX_LEN;
> > > > -       fdir_info->flow_types_mask[0] = IXGBE_FDIR_FLOW_TYPES;
> > > > +
> > > > +       if (fdir_info->mode == RTE_FDIR_MODE_PERFECT_MAC_VLAN
> > > > +               || fdir_info->mode == RTE_FDIR_MODE_PERFECT_TUNNEL)
> > > > +               fdir_info->flow_types_mask[0] = 0;
> > > > +       else
> > > > +               fdir_info->flow_types_mask[0] = IXGBE_FDIR_FLOW_TYPES;
> > > > +
> > > >         fdir_info->flex_payload_unit = sizeof(uint16_t);
> > > >         fdir_info->max_flex_payload_segment_num = 1;
> > > > -       fdir_info->flex_payload_limit = 62;
> > > > +       fdir_info->flex_payload_limit = IXGBE_MAX_FLX_SOURCE_OFF;
> > > >         fdir_info->flex_conf.nb_payloads = 1;
> > > >         fdir_info->flex_conf.flex_set[0].type = RTE_ETH_RAW_PAYLOAD;
> > > >         fdir_info->flex_conf.flex_set[0].src_offset[0] = offset; @@
> > > > -1095,7
> > > > +1252,7 @@ ixgbe_fdir_stats_get(struct rte_eth_dev *dev, struct
> > > rte_eth_fdir_stats *fdir_st
> > > >         reg = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL);
> > > >         max_num = (1 << (FDIRENTRIES_NUM_SHIFT +
> > > >                         (reg & FDIRCTRL_PBALLOC_MASK)));
> > > > -       if (dev->data->dev_conf.fdir_conf.mode ==
> > > RTE_FDIR_MODE_PERFECT)
> > > > +       if (dev->data->dev_conf.fdir_conf.mode >=
> > > RTE_FDIR_MODE_PERFECT)
> > > >                         fdir_stats->guarant_cnt = max_num - 
> > > > fdir_stats->free;
> > > >         else if (dev->data->dev_conf.fdir_conf.mode ==
> > > RTE_FDIR_MODE_SIGNATURE)
> > > >                 fdir_stats->guarant_cnt = max_num * 4 - 
> > > > fdir_stats->free;
> > > > --
> > > > 1.9.3

Reply via email to