[SK_BUFF]: Introduce skb_set_network_header
For the cases where the network header is being set to a offset from skb->data.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 76d30f3..870438f 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -970,6 +970,11 @@
skb->nh.raw = skb->data;
}
+static inline void skb_set_network_header(struct sk_buff *skb, const int offset)
+{
+ skb->nh.raw = skb->data + offset;
+}
+
static inline int skb_network_offset(const struct sk_buff *skb)
{
return skb->nh.raw - skb->data;
diff --git a/net/ax25/ax25_out.c b/net/ax25/ax25_out.c
index 02dea85..e66953c 100644
--- a/net/ax25/ax25_out.c
+++ b/net/ax25/ax25_out.c
@@ -148,7 +148,8 @@
if (ka9qfrag == 1) {
skb_reserve(skbn, frontlen + 2);
- skbn->nh.raw = skbn->data + skb_network_offset(skb);
+ skb_set_network_header(skbn,
+ skb_network_offset(skb));
memcpy(skb_put(skbn, len), skb->data, len);
p = skb_push(skbn, 2);
@@ -161,7 +162,8 @@
}
} else {
skb_reserve(skbn, frontlen + 1);
- skbn->nh.raw = skbn->data + skb_network_offset(skb);
+ skb_set_network_header(skbn,
+ skb_network_offset(skb));
memcpy(skb_put(skbn, len), skb->data, len);
p = skb_push(skbn, 1);
*p = AX25_P_TEXT;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index eae2284..15de9d4 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -928,9 +928,9 @@
* Find where to start putting bytes.
*/
data = skb_put(skb, fraglen);
- skb->nh.raw = data + exthdrlen;
+ skb_set_network_header(skb, exthdrlen);
+ skb->h.raw = skb->nh.raw + fragheaderlen;
data += fragheaderlen;
- skb->h.raw = data + exthdrlen;
if (fraggap) {
skb->csum = skb_copy_and_csum_bits(
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 0019083..5da823a 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -3634,7 +3634,8 @@
return;
skb_set_mac_header(nskb, skb_mac_header(skb) - skb->head);
- nskb->nh.raw = nskb->data + (skb_network_header(skb) - skb->head);
+ skb_set_network_header(nskb,
+ skb_network_header(skb) - skb->head);
nskb->h.raw = nskb->data + (skb->h.raw - skb->head);
skb_reserve(nskb, header);
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index f1dfcc3..bd25825 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1206,9 +1206,9 @@
* Find where to start putting bytes
*/
data = skb_put(skb, fraglen);
- skb->nh.raw = data + exthdrlen;
+ skb_set_network_header(skb, exthdrlen);
data += fragheaderlen;
- skb->h.raw = data + exthdrlen;
+ skb->h.raw = skb->nh.raw + fragheaderlen;
if (fraggap) {
skb->csum = skb_copy_and_csum_bits(