s390/qeth: extract helpers for next-hop lookup
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>
This commit is contained in:
Родитель
fb8d258049
Коммит
1d38c2e494
|
@ -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;
|
||||
|
|
|
@ -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))
|
||||
|
|
Загрузка…
Ссылка в новой задаче