s390/qeth: extract helpers for next-hop lookup
authorJulian Wiedmann <jwi@linux.ibm.com>
Wed, 6 May 2020 08:09:43 +0000 (10:09 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 May 2020 21:11:26 +0000 (14:11 -0700)
These will be used in a subsequent patch.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core.h
drivers/s390/net/qeth_l3_main.c

index 3d8b8e0f24383d56e0ca1e95cb5d91dfdd12ee84..6b0d37d2c638ce3f376491482d82f988f02d50c2 100644 (file)
@@ -34,6 +34,7 @@
 #include <net/ipv6.h>
 #include <net/if_inet6.h>
 #include <net/addrconf.h>
+#include <net/route.h>
 #include <net/sch_generic.h>
 #include <net/tcp.h>
 
@@ -234,11 +235,7 @@ struct qeth_hdr_layer3 {
        __u16 frame_offset;
        union {
                /* TX: */
-               struct in6_addr ipv6_addr;
-               struct ipv4 {
-                       u8 res[12];
-                       u32 addr;
-               } ipv4;
+               struct in6_addr addr;
                /* RX: */
                struct rx {
                        u8 res1[2];
@@ -355,8 +352,7 @@ static inline bool qeth_l3_same_next_hop(struct qeth_hdr_layer3 *h1,
                                         struct qeth_hdr_layer3 *h2)
 {
        return !((h1->flags ^ h2->flags) & QETH_HDR_IPV6) &&
-              ipv6_addr_equal(&h1->next_hop.ipv6_addr,
-                              &h2->next_hop.ipv6_addr);
+              ipv6_addr_equal(&h1->next_hop.addr, &h2->next_hop.addr);
 }
 
 struct qeth_local_addr {
@@ -945,6 +941,25 @@ static inline struct dst_entry *qeth_dst_check_rcu(struct sk_buff *skb, int ipv)
        return dst;
 }
 
+static inline __be32 qeth_next_hop_v4_rcu(struct sk_buff *skb,
+                                         struct dst_entry *dst)
+{
+       struct rtable *rt = (struct rtable *) dst;
+
+       return (rt) ? rt_nexthop(rt, ip_hdr(skb)->daddr) : ip_hdr(skb)->daddr;
+}
+
+static inline struct in6_addr *qeth_next_hop_v6_rcu(struct sk_buff *skb,
+                                                   struct dst_entry *dst)
+{
+       struct rt6_info *rt = (struct rt6_info *) dst;
+
+       if (rt && !ipv6_addr_any(&rt->rt6i_gateway))
+               return &rt->rt6i_gateway;
+       else
+               return &ipv6_hdr(skb)->daddr;
+}
+
 static inline void qeth_tx_csum(struct sk_buff *skb, u8 *flags, int ipv)
 {
        *flags |= QETH_HDR_EXT_CSUM_TRANSP_REQ;
index fec4ac41e946651a703a1eb575364e6ca6ab0439..1e50aa0297a37e2c2a3d807610f825bb8227c1c3 100644 (file)
@@ -1694,8 +1694,8 @@ static void qeth_l3_fill_header(struct qeth_qdio_out_q *queue,
 
                if (skb->protocol == htons(ETH_P_AF_IUCV)) {
                        l3_hdr->flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST;
-                       l3_hdr->next_hop.ipv6_addr.s6_addr16[0] = htons(0xfe80);
-                       memcpy(&l3_hdr->next_hop.ipv6_addr.s6_addr32[2],
+                       l3_hdr->next_hop.addr.s6_addr16[0] = htons(0xfe80);
+                       memcpy(&l3_hdr->next_hop.addr.s6_addr32[2],
                               iucv_trans_hdr(skb)->destUserID, 8);
                        return;
                }
@@ -1729,18 +1729,10 @@ static void qeth_l3_fill_header(struct qeth_qdio_out_q *queue,
        l3_hdr->flags |= qeth_l3_cast_type_to_flag(cast_type);
 
        if (ipv == 4) {
-               struct rtable *rt = (struct rtable *) dst;
-
-               *((__be32 *) &hdr->hdr.l3.next_hop.ipv4.addr) = (rt) ?
-                               rt_nexthop(rt, ip_hdr(skb)->daddr) :
-                               ip_hdr(skb)->daddr;
+               l3_hdr->next_hop.addr.s6_addr32[3] =
+                                       qeth_next_hop_v4_rcu(skb, dst);
        } else if (ipv == 6) {
-               struct rt6_info *rt = (struct rt6_info *) dst;
-
-               if (rt && !ipv6_addr_any(&rt->rt6i_gateway))
-                       l3_hdr->next_hop.ipv6_addr = rt->rt6i_gateway;
-               else
-                       l3_hdr->next_hop.ipv6_addr = ipv6_hdr(skb)->daddr;
+               l3_hdr->next_hop.addr = *qeth_next_hop_v6_rcu(skb, dst);
 
                hdr->hdr.l3.flags |= QETH_HDR_IPV6;
                if (!IS_IQD(card))