net/ice/base: fix loop limit
[dpdk.git] / drivers / net / ice / base / ice_switch.c
index 36da27f..b2945a9 100644 (file)
@@ -57,8 +57,7 @@ struct ice_dummy_pkt_offsets {
        u16 offset; /* ICE_PROTOCOL_LAST indicates end of list */
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_gre_tcp_packet_offsets[] = {
+static const struct ice_dummy_pkt_offsets dummy_gre_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -69,8 +68,7 @@ struct ice_dummy_pkt_offsets dummy_gre_tcp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const
-u8 dummy_gre_tcp_packet[] = {
+static const u8 dummy_gre_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -104,8 +102,7 @@ u8 dummy_gre_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_gre_udp_packet_offsets[] = {
+static const struct ice_dummy_pkt_offsets dummy_gre_udp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -116,8 +113,7 @@ struct ice_dummy_pkt_offsets dummy_gre_udp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const
-u8 dummy_gre_udp_packet[] = {
+static const u8 dummy_gre_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -148,8 +144,7 @@ u8 dummy_gre_udp_packet[] = {
        0x00, 0x08, 0x00, 0x00,
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_udp_tun_tcp_packet_offsets[] = {
+static const struct ice_dummy_pkt_offsets dummy_udp_tun_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -163,8 +158,7 @@ struct ice_dummy_pkt_offsets dummy_udp_tun_tcp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const
-u8 dummy_udp_tun_tcp_packet[] = {
+static const u8 dummy_udp_tun_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00,  /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -201,8 +195,7 @@ u8 dummy_udp_tun_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_udp_tun_udp_packet_offsets[] = {
+static const struct ice_dummy_pkt_offsets dummy_udp_tun_udp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -216,8 +209,7 @@ struct ice_dummy_pkt_offsets dummy_udp_tun_udp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const
-u8 dummy_udp_tun_udp_packet[] = {
+static const u8 dummy_udp_tun_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00,  /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -251,8 +243,8 @@ u8 dummy_udp_tun_udp_packet[] = {
        0x00, 0x08, 0x00, 0x00,
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_udp_packet_offsets[] = {
+/* offset info for MAC + IPv4 + UDP dummy packet */
+static const struct ice_dummy_pkt_offsets dummy_udp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -260,8 +252,8 @@ struct ice_dummy_pkt_offsets dummy_udp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_udp_packet[] = {
+/* Dummy packet for MAC + IPv4 + UDP */
+static const u8 dummy_udp_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -280,8 +272,40 @@ dummy_udp_packet[] = {
        0x00, 0x00,     /* 2 bytes for 4 byte alignment */
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_tcp_packet_offsets[] = {
+/* offset info for MAC + VLAN + IPv4 + UDP dummy packet */
+static const struct ice_dummy_pkt_offsets dummy_vlan_udp_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_ETYPE_OL,         12 },
+       { ICE_VLAN_OFOS,        14 },
+       { ICE_IPV4_OFOS,        18 },
+       { ICE_UDP_ILOS,         38 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+/* C-tag (801.1Q), IPv4:UDP dummy packet */
+static const u8 dummy_vlan_udp_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+
+       0x00, 0x00, 0x08, 0x00, /* ICE_VLAN_OFOS 14 */
+
+       0x45, 0x00, 0x00, 0x1c, /* ICE_IPV4_OFOS 18 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x11, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 38 */
+       0x00, 0x08, 0x00, 0x00,
+
+       0x00, 0x00,     /* 2 bytes for 4 byte alignment */
+};
+
+/* offset info for MAC + IPv4 + TCP dummy packet */
+static const struct ice_dummy_pkt_offsets dummy_tcp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV4_OFOS,        14 },
@@ -289,8 +313,8 @@ struct ice_dummy_pkt_offsets dummy_tcp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_tcp_packet[] = {
+/* Dummy packet for MAC + IPv4 + TCP */
+static const u8 dummy_tcp_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -312,8 +336,42 @@ dummy_tcp_packet[] = {
        0x00, 0x00,     /* 2 bytes for 4 byte alignment */
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_tcp_ipv6_packet_offsets[] = {
+/* offset info for MAC + VLAN (C-tag, 802.1Q) + IPv4 + TCP dummy packet */
+static const struct ice_dummy_pkt_offsets dummy_vlan_tcp_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_ETYPE_OL,         12 },
+       { ICE_VLAN_OFOS,        14 },
+       { ICE_IPV4_OFOS,        18 },
+       { ICE_TCP_IL,           38 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+/* C-tag (801.1Q), IPv4:TCP dummy packet */
+static const u8 dummy_vlan_tcp_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+
+       0x00, 0x00, 0x08, 0x00, /* ICE_VLAN_OFOS 14 */
+
+       0x45, 0x00, 0x00, 0x28, /* ICE_IPV4_OFOS 18 */
+       0x00, 0x01, 0x00, 0x00,
+       0x00, 0x06, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 38 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x50, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00,     /* 2 bytes for 4 byte alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_tcp_ipv6_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV6_OFOS,        14 },
@@ -321,8 +379,7 @@ struct ice_dummy_pkt_offsets dummy_tcp_ipv6_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_tcp_ipv6_packet[] = {
+static const u8 dummy_tcp_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -349,8 +406,49 @@ dummy_tcp_ipv6_packet[] = {
        0x00, 0x00, /* 2 bytes for 4 byte alignment */
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_udp_ipv6_packet_offsets[] = {
+/* C-tag (802.1Q): IPv6 + TCP */
+static const struct ice_dummy_pkt_offsets
+dummy_vlan_tcp_ipv6_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_ETYPE_OL,         12 },
+       { ICE_VLAN_OFOS,        14 },
+       { ICE_IPV6_OFOS,        18 },
+       { ICE_TCP_IL,           58 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+/* C-tag (802.1Q), IPv6 + TCP dummy packet */
+static const u8 dummy_vlan_tcp_ipv6_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+
+       0x00, 0x00, 0x86, 0xDD, /* ICE_VLAN_OFOS 14 */
+
+       0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 18 */
+       0x00, 0x14, 0x06, 0x00, /* Next header is TCP */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_TCP_IL 58 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x50, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, /* 2 bytes for 4 byte alignment */
+};
+
+/* IPv6 + UDP */
+static const struct ice_dummy_pkt_offsets dummy_udp_ipv6_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_IPV6_OFOS,        14 },
@@ -358,8 +456,8 @@ struct ice_dummy_pkt_offsets dummy_udp_ipv6_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_udp_ipv6_packet[] = {
+/* IPv6 + UDP dummy packet */
+static const u8 dummy_udp_ipv6_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -383,8 +481,45 @@ dummy_udp_ipv6_packet[] = {
        0x00, 0x00, /* 2 bytes for 4 byte alignment */
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_udp_gtp_packet_offsets[] = {
+/* C-tag (802.1Q): IPv6 + UDP */
+static const struct ice_dummy_pkt_offsets
+dummy_vlan_udp_ipv6_packet_offsets[] = {
+       { ICE_MAC_OFOS,         0 },
+       { ICE_ETYPE_OL,         12 },
+       { ICE_VLAN_OFOS,        14 },
+       { ICE_IPV6_OFOS,        18 },
+       { ICE_UDP_ILOS,         58 },
+       { ICE_PROTOCOL_LAST,    0 },
+};
+
+/* C-tag (802.1Q), IPv6 + UDP dummy packet */
+static const u8 dummy_vlan_udp_ipv6_packet[] = {
+       0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x81, 0x00,             /* ICE_ETYPE_OL 12 */
+
+       0x00, 0x00, 0x86, 0xDD, /* ICE_VLAN_OFOS 14 */
+
+       0x60, 0x00, 0x00, 0x00, /* ICE_IPV6_OFOS 18 */
+       0x00, 0x08, 0x11, 0x00, /* Next header UDP */
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00,
+
+       0x00, 0x00, 0x00, 0x00, /* ICE_UDP_ILOS 58 */
+       0x00, 0x08, 0x00, 0x00,
+
+       0x00, 0x00, /* 2 bytes for 4 byte alignment */
+};
+
+static const struct ice_dummy_pkt_offsets dummy_udp_gtp_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_IPV4_OFOS,        14 },
        { ICE_UDP_OF,           34 },
@@ -392,8 +527,7 @@ struct ice_dummy_pkt_offsets dummy_udp_gtp_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_udp_gtp_packet[] = {
+static const u8 dummy_udp_gtp_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -416,8 +550,7 @@ dummy_udp_gtp_packet[] = {
        0x00, 0x00, 0x00, 0x00,
 };
 
-static const
-struct ice_dummy_pkt_offsets dummy_pppoe_packet_offsets[] = {
+static const struct ice_dummy_pkt_offsets dummy_pppoe_packet_offsets[] = {
        { ICE_MAC_OFOS,         0 },
        { ICE_ETYPE_OL,         12 },
        { ICE_VLAN_OFOS,        14},
@@ -425,8 +558,7 @@ struct ice_dummy_pkt_offsets dummy_pppoe_packet_offsets[] = {
        { ICE_PROTOCOL_LAST,    0 },
 };
 
-static const u8
-dummy_pppoe_packet[] = {
+static const u8 dummy_pppoe_packet[] = {
        0x00, 0x00, 0x00, 0x00, /* ICE_MAC_OFOS 0 */
        0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00,
@@ -4748,7 +4880,7 @@ static bool ice_prot_type_to_id(enum ice_protocol_type type, u16 *id)
 {
        u16 i;
 
-       for (i = 0; ice_prot_id_tbl[i].type != ICE_PROTOCOL_LAST; i++)
+       for (i = 0; i < ARRAY_SIZE(ice_prot_id_tbl); i++)
                if (ice_prot_id_tbl[i].type == type) {
                        *id = ice_prot_id_tbl[i].protocol_id;
                        return true;
@@ -5643,7 +5775,7 @@ 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, ipv6 = false;
+       bool tcp = false, udp = false, ipv6 = false, vlan = false;
        u16 i;
 
        if (tun_type == ICE_SW_TUN_GTP) {
@@ -5665,6 +5797,8 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                        tcp = true;
                else if (lkups[i].type == ICE_IPV6_OFOS)
                        ipv6 = true;
+               else if (lkups[i].type == ICE_VLAN_OFOS)
+                       vlan = true;
        }
 
        if (tun_type == ICE_ALL_TUNNELS) {
@@ -5704,25 +5838,49 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
        }
 
        if (udp && !ipv6) {
+               if (vlan) {
+                       *pkt = dummy_vlan_udp_packet;
+                       *pkt_len = sizeof(dummy_vlan_udp_packet);
+                       *offsets = dummy_vlan_udp_packet_offsets;
+                       return;
+               }
                *pkt = dummy_udp_packet;
                *pkt_len = sizeof(dummy_udp_packet);
                *offsets = dummy_udp_packet_offsets;
                return;
        } else if (udp && ipv6) {
+               if (vlan) {
+                       *pkt = dummy_vlan_udp_ipv6_packet;
+                       *pkt_len = sizeof(dummy_vlan_udp_ipv6_packet);
+                       *offsets = dummy_vlan_udp_ipv6_packet_offsets;
+                       return;
+               }
                *pkt = dummy_udp_ipv6_packet;
                *pkt_len = sizeof(dummy_udp_ipv6_packet);
                *offsets = dummy_udp_ipv6_packet_offsets;
                return;
        } else if ((tcp && ipv6) || ipv6) {
+               if (vlan) {
+                       *pkt = dummy_vlan_tcp_ipv6_packet;
+                       *pkt_len = sizeof(dummy_vlan_tcp_ipv6_packet);
+                       *offsets = dummy_vlan_tcp_ipv6_packet_offsets;
+                       return;
+               }
                *pkt = dummy_tcp_ipv6_packet;
                *pkt_len = sizeof(dummy_tcp_ipv6_packet);
                *offsets = dummy_tcp_ipv6_packet_offsets;
                return;
        }
 
-       *pkt = dummy_tcp_packet;
-       *pkt_len = sizeof(dummy_tcp_packet);
-       *offsets = dummy_tcp_packet_offsets;
+       if (vlan) {
+               *pkt = dummy_vlan_tcp_packet;
+               *pkt_len = sizeof(dummy_vlan_tcp_packet);
+               *offsets = dummy_vlan_tcp_packet_offsets;
+       } else {
+               *pkt = dummy_tcp_packet;
+               *pkt_len = sizeof(dummy_tcp_packet);
+               *offsets = dummy_tcp_packet_offsets;
+       }
 }
 
 /**
@@ -5789,19 +5947,6 @@ ice_fill_adv_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt,
                        break;
                case ICE_IPV6_OFOS:
                case ICE_IPV6_IL:
-                       /* Based on the same mechanism below, if tc (Traffic
-                        * Class) for IPv6 has mask, it means tc field is set.
-                        * Since tc is only one byte, we have to handle the
-                        * big/little endian issue before it can be inserted.
-                        */
-                       if (lkups[i].m_u.ipv6_hdr.tc) {
-                               ((u16 *)&lkups[i].h_u)[0] =
-                                       (((u16 *)&lkups[i].h_u)[0] << 8) |
-                                       (((u16 *)&lkups[i].h_u)[0] >> 8);
-                               ((u16 *)&lkups[i].m_u)[0] =
-                                       (((u16 *)&lkups[i].m_u)[0] << 8) |
-                                       (((u16 *)&lkups[i].m_u)[0] >> 8);
-                       }
                        len = sizeof(struct ice_ipv6_hdr);
                        break;
                case ICE_TCP_IL:
@@ -5896,7 +6041,7 @@ ice_fill_adv_packet_tun(struct ice_hw *hw, enum ice_sw_tunnel_type tun_type,
 
                        offset = offsets[i].offset;
                        hdr = (struct ice_l4_hdr *)&pkt[offset];
-                       hdr->dst_port = open_port << 8 | open_port >> 8;
+                       hdr->dst_port = CPU_TO_BE16(open_port);
 
                        return ICE_SUCCESS;
                }