Commit 87e7597b authored by David Miller's avatar David Miller Committed by David S. Miller

qeth: Move away from using neighbour entries in qeth_l3_fill_header()

We've moving to a model where dst_entry objects to not have
a reference to the associated neighbour entry, instead such
neighbours must be looked up on-demand.

Here in qeth_l3_fill_header() it's actually much simpler to
use the information in the route itself.  The code is
already conditionalized upon protocol type.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Tested-by: default avatarUrsula Braun <ubraun@linux.vnet.ibm.com>
parent 57b9bef0
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include <net/ip.h> #include <net/ip.h>
#include <net/arp.h> #include <net/arp.h>
#include <net/route.h>
#include <net/ip6_fib.h>
#include <net/ip6_checksum.h> #include <net/ip6_checksum.h>
#include <net/iucv/af_iucv.h> #include <net/iucv/af_iucv.h>
...@@ -2832,7 +2834,6 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card, ...@@ -2832,7 +2834,6 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card *card,
static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
struct sk_buff *skb, int ipv, int cast_type) struct sk_buff *skb, int ipv, int cast_type)
{ {
struct neighbour *n = NULL;
struct dst_entry *dst; struct dst_entry *dst;
memset(hdr, 0, sizeof(struct qeth_hdr)); memset(hdr, 0, sizeof(struct qeth_hdr));
...@@ -2855,33 +2856,29 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr, ...@@ -2855,33 +2856,29 @@ static void qeth_l3_fill_header(struct qeth_card *card, struct qeth_hdr *hdr,
rcu_read_lock(); rcu_read_lock();
dst = skb_dst(skb); dst = skb_dst(skb);
if (dst)
n = dst_get_neighbour_noref(dst);
if (ipv == 4) { if (ipv == 4) {
struct rtable *rt = (struct rtable *) dst;
__be32 *pkey = &ip_hdr(skb)->daddr;
if (rt->rt_gateway)
pkey = &rt->rt_gateway;
/* IPv4 */ /* IPv4 */
hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type); hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags4(cast_type);
memset(hdr->hdr.l3.dest_addr, 0, 12); memset(hdr->hdr.l3.dest_addr, 0, 12);
if (n) { *((__be32 *) (&hdr->hdr.l3.dest_addr[12])) = *pkey;
*((u32 *) (&hdr->hdr.l3.dest_addr[12])) =
*((u32 *) n->primary_key);
} else {
/* fill in destination address used in ip header */
*((u32 *) (&hdr->hdr.l3.dest_addr[12])) =
ip_hdr(skb)->daddr;
}
} else if (ipv == 6) { } else if (ipv == 6) {
struct rt6_info *rt = (struct rt6_info *) dst;
struct in6_addr *pkey = &ipv6_hdr(skb)->daddr;
if (!ipv6_addr_any(&rt->rt6i_gateway))
pkey = &rt->rt6i_gateway;
/* IPv6 */ /* IPv6 */
hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type); hdr->hdr.l3.flags = qeth_l3_get_qeth_hdr_flags6(cast_type);
if (card->info.type == QETH_CARD_TYPE_IQD) if (card->info.type == QETH_CARD_TYPE_IQD)
hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU; hdr->hdr.l3.flags &= ~QETH_HDR_PASSTHRU;
if (n) { memcpy(hdr->hdr.l3.dest_addr, pkey, 16);
memcpy(hdr->hdr.l3.dest_addr,
n->primary_key, 16);
} else {
/* fill in destination address used in ip header */
memcpy(hdr->hdr.l3.dest_addr,
&ipv6_hdr(skb)->daddr, 16);
}
} else { } else {
/* passthrough */ /* passthrough */
if ((skb->dev->type == ARPHRD_IEEE802_TR) && if ((skb->dev->type == ARPHRD_IEEE802_TR) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment