提交 48d49d0c 编写于 作者: A Arnaldo Carvalho de Melo 提交者: David S. Miller

[SK_BUFF]: Introduce skb_set_mac_header()

For the cases where we want to set skb->mac.raw to an offset from skb->data.

Simple cases first, the memmove ones and specially pktgen will be left for later.
Signed-off-by: NArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 f64955eb
...@@ -90,7 +90,7 @@ static void emulate_large_send_offload(struct sk_buff *skb) ...@@ -90,7 +90,7 @@ static void emulate_large_send_offload(struct sk_buff *skb)
if (!nskb) if (!nskb)
break; break;
skb_reserve(nskb, 32); skb_reserve(nskb, 32);
nskb->mac.raw = nskb->data - 14; skb_set_mac_header(nskb, -ETH_HLEN);
nskb->nh.raw = nskb->data; nskb->nh.raw = nskb->data;
iph = nskb->nh.iph; iph = nskb->nh.iph;
memcpy(nskb->data, skb->nh.raw, doffset); memcpy(nskb->data, skb->nh.raw, doffset);
......
...@@ -368,7 +368,7 @@ static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev) ...@@ -368,7 +368,7 @@ static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev)
struct ethhdr *eth; struct ethhdr *eth;
unsigned char *rawp; unsigned char *rawp;
skb->mac.raw = skb->data + MYRI_PAD_LEN; skb_set_mac_header(skb, MYRI_PAD_LEN);
skb_pull(skb, dev->hard_header_len); skb_pull(skb, dev->hard_header_len);
eth = eth_hdr(skb); eth = eth_hdr(skb);
......
...@@ -486,7 +486,7 @@ qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx, ...@@ -486,7 +486,7 @@ qeth_eddp_fill_context_tcp(struct qeth_eddp_context *ctx,
return -ENOMEM; return -ENOMEM;
} }
if (qhdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2) { if (qhdr->hdr.l2.id == QETH_HEADER_TYPE_LAYER2) {
skb->mac.raw = skb->data + sizeof(struct qeth_hdr); skb_set_mac_header(skb, sizeof(struct qeth_hdr));
memcpy(&eddp->mac, eth_hdr(skb), ETH_HLEN); memcpy(&eddp->mac, eth_hdr(skb), ETH_HLEN);
#ifdef CONFIG_QETH_VLAN #ifdef CONFIG_QETH_VLAN
if (eddp->mac.h_proto == __constant_htons(ETH_P_8021Q)) { if (eddp->mac.h_proto == __constant_htons(ETH_P_8021Q)) {
......
...@@ -2306,7 +2306,7 @@ qeth_rebuild_skb_fake_ll_tr(struct qeth_card *card, struct sk_buff *skb, ...@@ -2306,7 +2306,7 @@ qeth_rebuild_skb_fake_ll_tr(struct qeth_card *card, struct sk_buff *skb,
struct iphdr *ip_hdr; struct iphdr *ip_hdr;
QETH_DBF_TEXT(trace,5,"skbfktr"); QETH_DBF_TEXT(trace,5,"skbfktr");
skb->mac.raw = skb->data - QETH_FAKE_LL_LEN_TR; skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_TR);
/* this is a fake ethernet header */ /* this is a fake ethernet header */
fake_hdr = tr_hdr(skb); fake_hdr = tr_hdr(skb);
...@@ -2359,7 +2359,7 @@ qeth_rebuild_skb_fake_ll_eth(struct qeth_card *card, struct sk_buff *skb, ...@@ -2359,7 +2359,7 @@ qeth_rebuild_skb_fake_ll_eth(struct qeth_card *card, struct sk_buff *skb,
struct iphdr *ip_hdr; struct iphdr *ip_hdr;
QETH_DBF_TEXT(trace,5,"skbfketh"); QETH_DBF_TEXT(trace,5,"skbfketh");
skb->mac.raw = skb->data - QETH_FAKE_LL_LEN_ETH; skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_ETH);
/* this is a fake ethernet header */ /* this is a fake ethernet header */
fake_hdr = eth_hdr(skb); fake_hdr = eth_hdr(skb);
......
...@@ -965,6 +965,11 @@ static inline void skb_reset_mac_header(struct sk_buff *skb) ...@@ -965,6 +965,11 @@ static inline void skb_reset_mac_header(struct sk_buff *skb)
skb->mac.raw = skb->data; skb->mac.raw = skb->data;
} }
static inline void skb_set_mac_header(struct sk_buff *skb, const int offset)
{
skb->mac.raw = skb->data + offset;
}
/* /*
* CPUs often take a performance hit when accessing unaligned memory * CPUs often take a performance hit when accessing unaligned memory
* locations. The actual performance hit varies, it can be small if the * locations. The actual performance hit varies, it can be small if the
......
...@@ -458,7 +458,7 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb) ...@@ -458,7 +458,7 @@ static void br2684_push(struct atm_vcc *atmvcc, struct sk_buff *skb)
/* FIXME: tcpdump shows that pointer to mac header is 2 bytes earlier, /* FIXME: tcpdump shows that pointer to mac header is 2 bytes earlier,
than should be. What else should I set? */ than should be. What else should I set? */
skb_pull(skb, plen); skb_pull(skb, plen);
skb->mac.raw = skb->data - ETH_HLEN; skb_set_mac_header(skb, -ETH_HLEN);
skb->pkt_type = PACKET_HOST; skb->pkt_type = PACKET_HOST;
#ifdef CONFIG_BR2684_FAST_TRANS #ifdef CONFIG_BR2684_FAST_TRANS
skb->protocol = ((u16 *) skb->data)[-1]; skb->protocol = ((u16 *) skb->data)[-1];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册