aboutsummaryrefslogtreecommitdiffstats
path: root/net/6lowpan/iphc.c
diff options
context:
space:
mode:
authorMartin Townsend <mtownsend1973@gmail.com>2014-10-23 10:40:53 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-10-27 10:51:15 -0400
commitf8b361768ea2eaf9b21dfbe7388958ec31798c8b (patch)
treee2b9ea93b72fbf33d6f9ee84a7fc63edfaba8c92 /net/6lowpan/iphc.c
parentf81f466ca588a5bd868008154050305481f241d4 (diff)
6lowpan: remove skb_deliver from IPHC
Separating skb delivery from decompression ensures that we can support further decompression schemes and removes the mixed return value of error codes with NET_RX_FOO. Signed-off-by: Martin Townsend <mtownsend1973@gmail.com> Acked-by: Alexander Aring <alex.aring@gmail.com> Acked-by: Jukka Rissanen <jukka.rissanen@linux.intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/6lowpan/iphc.c')
-rw-r--r--net/6lowpan/iphc.c32
1 files changed, 6 insertions, 26 deletions
diff --git a/net/6lowpan/iphc.c b/net/6lowpan/iphc.c
index 747b3ccfc4f8..45714fe885f0 100644
--- a/net/6lowpan/iphc.c
+++ b/net/6lowpan/iphc.c
@@ -171,29 +171,6 @@ static int uncompress_context_based_src_addr(struct sk_buff *skb,
171 return 0; 171 return 0;
172} 172}
173 173
174static int skb_deliver(struct sk_buff *skb, struct ipv6hdr *hdr,
175 struct net_device *dev, skb_delivery_cb deliver_skb)
176{
177 int stat;
178
179 skb_push(skb, sizeof(struct ipv6hdr));
180 skb_reset_network_header(skb);
181 skb_copy_to_linear_data(skb, hdr, sizeof(struct ipv6hdr));
182
183 skb->protocol = htons(ETH_P_IPV6);
184 skb->pkt_type = PACKET_HOST;
185 skb->dev = dev;
186
187 raw_dump_table(__func__, "raw skb data dump before receiving",
188 skb->data, skb->len);
189
190 stat = deliver_skb(skb, dev);
191
192 consume_skb(skb);
193
194 return stat;
195}
196
197/* Uncompress function for multicast destination address, 174/* Uncompress function for multicast destination address,
198 * when M bit is set. 175 * when M bit is set.
199 */ 176 */
@@ -327,7 +304,7 @@ static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };
327int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, 304int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
328 const u8 *saddr, const u8 saddr_type, const u8 saddr_len, 305 const u8 *saddr, const u8 saddr_type, const u8 saddr_len,
329 const u8 *daddr, const u8 daddr_type, const u8 daddr_len, 306 const u8 *daddr, const u8 daddr_type, const u8 daddr_len,
330 u8 iphc0, u8 iphc1, skb_delivery_cb deliver_skb) 307 u8 iphc0, u8 iphc1)
331{ 308{
332 struct ipv6hdr hdr = {}; 309 struct ipv6hdr hdr = {};
333 u8 tmp, num_context = 0; 310 u8 tmp, num_context = 0;
@@ -492,10 +469,13 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev,
492 hdr.version, ntohs(hdr.payload_len), hdr.nexthdr, 469 hdr.version, ntohs(hdr.payload_len), hdr.nexthdr,
493 hdr.hop_limit, &hdr.daddr); 470 hdr.hop_limit, &hdr.daddr);
494 471
495 raw_dump_table(__func__, "raw header dump", (u8 *)&hdr, sizeof(hdr)); 472 skb_push(skb, sizeof(hdr));
473 skb_reset_network_header(skb);
474 skb_copy_to_linear_data(skb, &hdr, sizeof(hdr));
496 475
497 return skb_deliver(skb, &hdr, dev, deliver_skb); 476 raw_dump_table(__func__, "raw header dump", (u8 *)&hdr, sizeof(hdr));
498 477
478 return 0;
499drop: 479drop:
500 kfree_skb(skb); 480 kfree_skb(skb);
501 return -EINVAL; 481 return -EINVAL;