This patch corrects some errors in UDP and TCP switch rule
programming by adding additional dummy packets.

Fixes: 5e81d85ff066 ("net/ice/base: enable additional switch rules")

Signed-off-by: Dan Nowlin <dan.now...@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell...@intel.com>
Signed-off-by: Leyi Rong <leyi.r...@intel.com>
---
 drivers/net/ice/base/ice_switch.c | 156 +++++++++++++++++++++++-------
 1 file changed, 123 insertions(+), 33 deletions(-)

diff --git a/drivers/net/ice/base/ice_switch.c 
b/drivers/net/ice/base/ice_switch.c
index 660d491ed..2e1dbfe42 100644
--- a/drivers/net/ice/base/ice_switch.c
+++ b/drivers/net/ice/base/ice_switch.c
@@ -89,7 +89,7 @@ u8 dummy_gre_packet[] = { 0, 0, 0, 0,         /* ICE_MAC_OFOS 
0 */
                        };
 
 static const
-struct ice_dummy_pkt_offsets dummy_udp_tun_packet_offsets[] = {
+struct ice_dummy_pkt_offsets dummy_udp_tun_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_IPV4_OFOS,        14 },
        { ICE_UDP_OF,           34 },
@@ -101,7 +101,7 @@ struct ice_dummy_pkt_offsets dummy_udp_tun_packet_offsets[] 
= {
 };
 
 static const
-u8 dummy_udp_tun_packet[] = {
+u8 dummy_udp_tun_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00,  /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -138,7 +138,80 @@ u8 dummy_udp_tun_packet[] = {
 };
 
 static const
-struct ice_dummy_pkt_offsets dummy_tcp_tun_packet_offsets[] = {
+struct ice_dummy_pkt_offsets dummy_udp_tun_udp_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_IPV4_OFOS,        14 },
+       { ICE_UDP_OF,           34 },
+       { ICE_VXLAN,            42 },
+       { ICE_MAC_IL,           50 },
+       { ICE_IPV4_IL,          64 },
+       { ICE_UDP_ILOS,         84 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+static const
+u8 dummy_udp_tun_udp_packet[] = {
+       0x00, 0x00, 0x00, 0x00,  /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x08, 0x00,
+
+       0x45, 0x00, 0x00, 0x4e, /* ICE_IPV4_OFOS 14 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x11, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x12, 0xb5, /* ICE_UDP_OF 34 */
+       0x00, 0x3a, 0x00, 0x00,
+
+       0x0c, 0x00, 0x00, 0x03, /* ICE_VXLAN 42 */
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_IL 50 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x08, 0x00,
+
+       0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_IL 64 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x11, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 84 */
+       0x00, 0x08, 0x00, 0x00,
+};
+
+static const
+struct ice_dummy_pkt_offsets dummy_udp_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_IPV4_OFOS,        14 },
+       { ICE_UDP_ILOS,         34 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+static const u8
+dummy_udp_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x08, 0x00,
+
+       0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_OFOS 14 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x11, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 34 */
+       0x00, 0x08, 0x00, 0x00,
+
+       0x00, 0x00,     /* 2 bytes for 4 byte alignment */
+};
+
+static const
+struct ice_dummy_pkt_offsets dummy_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_IPV4_OFOS,        14 },
        { ICE_TCP_IL,           34 },
@@ -146,22 +219,26 @@ struct ice_dummy_pkt_offsets 
dummy_tcp_tun_packet_offsets[] = {
 };
 
 static const u8
-dummy_tcp_tun_packet[] = {0, 0, 0, 0,          /* ICE_MAC_OFOS 0 */
-                         0, 0, 0, 0,
-                         0, 0, 0, 0,
-                         0x08, 0,
-                         0x45, 0, 0, 0x28,     /* ICE_IPV4_OFOS 14 */
-                         0, 0x01, 0, 0,
-                         0x40, 0x06, 0xF5, 0x69,
-                         0, 0, 0, 0,
-                         0, 0, 0, 0,
-                         0, 0, 0, 0,           /* ICE_TCP_IL 34 */
-                         0, 0, 0, 0,
-                         0, 0, 0, 0,
-                         0x50, 0x02, 0x20,
-                         0, 0x9, 0x79, 0, 0,
-                         0, 0 /* 2 bytes padding for 4 byte alignment*/
-                       };
+dummy_tcp_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x08, 0x00,
+
+       0x45, 0x00, 0x00, 0x28, /* ICE_IPV4_OFOS 14 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x06, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 34 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x50, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00,     /* 2 bytes for 4 byte alignment */
+};
 
 /* this is a recipe to profile bitmap association */
 static ice_declare_bitmap(recipe_to_profile[ICE_MAX_NUM_RECIPES],
@@ -5195,8 +5272,16 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, 
u16 lkups_cnt,
                      u16 *pkt_len,
                      const struct ice_dummy_pkt_offsets **offsets)
 {
+       bool tcp = false, udp = false;
        u16 i;
 
+       for (i = 0; i < lkups_cnt; i++) {
+               if (lkups[i].type == ICE_UDP_ILOS)
+                       udp = true;
+               else if (lkups[i].type == ICE_TCP_IL)
+                       tcp = true;
+       }
+
        if (tun_type == ICE_SW_TUN_NVGRE || tun_type == ICE_ALL_TUNNELS) {
                *pkt = dummy_gre_packet;
                *pkt_len = sizeof(dummy_gre_packet);
@@ -5205,25 +5290,30 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, 
u16 lkups_cnt,
        }
 
        if (tun_type == ICE_SW_TUN_VXLAN || tun_type == ICE_SW_TUN_GENEVE ||
-           tun_type == ICE_SW_TUN_VXLAN_GPE) {
-               *pkt = dummy_udp_tun_packet;
-               *pkt_len = sizeof(dummy_udp_tun_packet);
-               *offsets = dummy_udp_tun_packet_offsets;
+           tun_type == ICE_SW_TUN_VXLAN_GPE || tun_type == ICE_SW_TUN_UDP) {
+               if (tcp) {
+                       *pkt = dummy_udp_tun_tcp_packet;
+                       *pkt_len = sizeof(dummy_udp_tun_tcp_packet);
+                       *offsets = dummy_udp_tun_tcp_packet_offsets;
+                       return;
+               }
+
+               *pkt = dummy_udp_tun_udp_packet;
+               *pkt_len = sizeof(dummy_udp_tun_udp_packet);
+               *offsets = dummy_udp_tun_udp_packet_offsets;
                return;
        }
 
-       for (i = 0; i < lkups_cnt; i++) {
-               if (lkups[i].type == ICE_UDP_ILOS) {
-                       *pkt = dummy_udp_tun_packet;
-                       *pkt_len = sizeof(dummy_udp_tun_packet);
-                       *offsets = dummy_udp_tun_packet_offsets;
-                       return;
-               }
+       if (udp) {
+               *pkt = dummy_udp_packet;
+               *pkt_len = sizeof(dummy_udp_packet);
+               *offsets = dummy_udp_packet_offsets;
+               return;
        }
 
-       *pkt = dummy_tcp_tun_packet;
-       *pkt_len = sizeof(dummy_tcp_tun_packet);
-       *offsets = dummy_tcp_tun_packet_offsets;
+       *pkt = dummy_tcp_packet;
+       *pkt_len = sizeof(dummy_tcp_packet);
+       *offsets = dummy_tcp_packet_offsets;
 }
 
 /**
-- 
2.17.1

Reply via email to