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: David S. Miller <davem@davemloft.net> Tested-by: Ursula Braun <ubraun@linux.vnet.ibm.com>
This commit is contained in:
parent
57b9bef0d6
commit
87e7597b5a
|
@ -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,
|
||||||
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,
|
||||||
|
|
||||||
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) &&
|
||||||
|
|
Loading…
Reference in New Issue