6lowpan: Move skb delivery out of IPHC
Subsystems (5)
v5 cover 6lowpan: Move skb delivery out of IPHC
This series moves skb delivery out of IPHC and into the receive routines of both bluetooth and 802.15.4. The reason is that we need to support more (de)compression schemes in the future. It also means that calling lowpan_process_data now only returns error codes or 0 for success so this has been cleaned up. The final patch then renames occurences of lowpan_process_data and process_data to something more meaningful.
v1 -> v2
* Handle freeing of skb in lowpan_give_skb_to_devices for 802.15.14
* Added another skb_consume in bluetooth code for uncompressed IPv6 headers
* Added missing skb_consume for local_skb for bluetooth in compreesed IPv6 header path
* Combine patch 4 into 1.
v2 -> v3
* Ensure error codes aren't returned in the bluetooth skb delivery function.
* In lowpan_give_skb_to_devices return NET_RX_DROP when the first call to netif_rx fails.
v3 -> v4
* Fixed incorrect frag return handling due to refactoring skb_deliver.
v4 -> v5
* Removed unnecessary break statements in lowpan_rcv
Martin Townsend (4):
6lowpan: remove skb_deliver from IPHC
6lowpan: fix process_data return values
bluetooth:6lowpan: use consume_skb when packet processed successfully
ieee802154: 6lowpan: rename process_data and lowpan_process_data
include/net/6lowpan.h | 12 ++++----- net/6lowpan/iphc.c | 42 +++++++++--------------------- net/bluetooth/6lowpan.c | 36 +++++++++++++++++--------- net/ieee802154/6lowpan_rtnl.c | 60 ++++++++++++++++++++++++++----------------- 4 files changed, 78 insertions(+), 72 deletions(-)
Signature · 1 line
1.9.1
PATCH v5 1/4 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.
--- include/net/6lowpan.h | 4 +--- net/6lowpan/iphc.c | 32 ++++++-------------------------- net/bluetooth/6lowpan.c | 14 ++++++++++++-- net/ieee802154/6lowpan_rtnl.c | 41 ++++++++++++++++++++++++++--------------- 4 files changed, 45 insertions(+), 46 deletions(-)
include/net/6lowpan.h +1 -3
@@ -372,12 +372,10 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 *dgram_offset)return skb->len + uncomp_header - ret; } -typedef int (*skb_delivery_cb )(struct sk_buff *skb,struct net_device *dev); -int lowpan_process_data (struct sk_buff *skb,struct net_device *dev,const u8 *saddr,const u8 saddr_type,const u8 saddr_len,const u8 *daddr,const u8 daddr_type,const u8 daddr_len, -u8 iphc0,u8 iphc1,skb_delivery_cb skb_deliver); +u8 iphc0,u8 iphc1);int lowpan_header_compress (struct sk_buff *skb,struct net_device *dev,unsigned short type,const void *_daddr,const void *_saddr,unsigned int len);
net/6lowpan/iphc.c +6 -26
@@ -171,29 +171,6 @@ static int uncompress_context_based_src_addr(struct sk_buff *skb,return 0 ; } -static int skb_deliver (struct sk_buff *skb,struct ipv6hdr *hdr, -struct net_device *dev,skb_delivery_cb deliver_skb) -{ -int stat; - -skb_push (skb,sizeof (struct ipv6hdr )); -skb_reset_network_header (skb); -skb_copy_to_linear_data (skb, hdr,sizeof (struct ipv6hdr )); - - skb->protocol =htons (ETH_P_IPV6 ); - skb->pkt_type =PACKET_HOST ; - skb->dev = dev; - -raw_dump_table (__func__,"raw skb data dump before receiving" , - skb->data, skb->len); - - stat =deliver_skb (skb, dev); - -consume_skb (skb); - -return stat; -} -/* Uncompress function for multicast destination address, * when M bit is set. */
@@ -327,7 +304,7 @@ static const u8 lowpan_ttl_values[] = { 0, 1, 64, 255 };int lowpan_process_data (struct sk_buff *skb,struct net_device *dev,const u8 *saddr,const u8 saddr_type,const u8 saddr_len,const u8 *daddr,const u8 daddr_type,const u8 daddr_len, -u8 iphc0,u8 iphc1,skb_delivery_cb deliver_skb) +u8 iphc0,u8 iphc1) {struct ipv6hdr hdr = {};u8 tmp, num_context =0 ;
@@ -492,10 +469,13 @@ int lowpan_process_data(struct sk_buff *skb, struct net_device *dev, hdr.version,ntohs (hdr.payload_len), hdr.nexthdr, hdr.hop_limit, &hdr.daddr); -raw_dump_table (__func__,"raw header dump" , (u8 *)&hdr,sizeof (hdr)); +skb_push (skb,sizeof (hdr)); +skb_reset_network_header (skb); +skb_copy_to_linear_data (skb, &hdr,sizeof (hdr)); -return skb_deliver (skb, &hdr, dev, deliver_skb); +raw_dump_table (__func__,"raw header dump" , (u8 *)&hdr,sizeof (hdr)); +return 0 ; drop:kfree_skb (skb);return -EINVAL ;
net/bluetooth/6lowpan.c +12 -2
@@ -252,7 +252,7 @@ static int give_skb_to_upper(struct sk_buff *skb, struct net_device *dev) skb_cp =skb_copy (skb,GFP_ATOMIC );if (!skb_cp) -return -ENOMEM ; +return NET_RX_DROP ;return netif_rx (skb_cp); }
@@ -290,7 +290,7 @@ static int process_data(struct sk_buff *skb, struct net_device *netdev,return lowpan_process_data (skb, netdev, saddr,IEEE802154_ADDR_LONG ,EUI64_ADDR_LEN , daddr,IEEE802154_ADDR_LONG ,EUI64_ADDR_LEN , - iphc0, iphc1, give_skb_to_upper); + iphc0, iphc1); drop:kfree_skb (skb);
@@ -350,6 +350,16 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,if (ret !=NET_RX_SUCCESS ) goto drop; + local_skb->protocol =htons (ETH_P_IPV6 ); + local_skb->pkt_type =PACKET_HOST ; + local_skb->dev = dev; + +if (give_skb_to_upper (local_skb, dev) + !=NET_RX_SUCCESS ) { +kfree_skb (local_skb); + goto drop; + } + dev->stats.rx_bytes += skb->len; dev->stats.rx_packets++;
net/ieee802154/6lowpan_rtnl.c +26 -15
98 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v5 2/4 6lowpan: fix process_data return values
In reply to Martin TownsendAs process_data now returns just error codes fix up the calls to this function to only drop the skb if an error code is returned.
--- net/bluetooth/6lowpan.c | 2 +- net/ieee802154/6lowpan_rtnl.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
net/bluetooth/6lowpan.c +1 -1
@@ -347,7 +347,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev, goto drop; ret =process_data (local_skb, dev, chan); -if (ret !=NET_RX_SUCCESS ) +if (ret <0 ) goto drop; local_skb->protocol =htons (ETH_P_IPV6 );
net/ieee802154/6lowpan_rtnl.c +3 -3
@@ -542,7 +542,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,switch (skb->data[0 ] &0xe0 ) {case LOWPAN_DISPATCH_IPHC :/* ipv6 datagram */ ret =process_data (skb, &hdr); -if (ret ==NET_RX_DROP ) +if (ret <0 ) goto drop;return lowpan_give_skb_to_devices (skb,NULL );
@@ -550,7 +550,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, ret =lowpan_frag_rcv (skb,LOWPAN_DISPATCH_FRAG1 );if (ret ==1 ) { ret =process_data (skb, &hdr); -if (ret ==NET_RX_DROP ) +if (ret <0 ) goto drop;return lowpan_give_skb_to_devices (skb,NULL );
@@ -563,7 +563,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, ret =lowpan_frag_rcv (skb,LOWPAN_DISPATCH_FRAGN );if (ret ==1 ) { ret =process_data (skb, &hdr); -if (ret ==NET_RX_DROP ) +if (ret <0 ) goto drop;return lowpan_give_skb_to_devices (skb,NULL );
Signature · 1 line
1.9.1
PATCH v5 3/4 bluetooth:6lowpan: use consume_skb when packet processed successfully
In reply to Martin TownsendFrom: Martin Townsend <[email protected]>
--- net/bluetooth/6lowpan.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/bluetooth/6lowpan.c +4 -3
@@ -337,8 +337,8 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev, dev->stats.rx_bytes += skb->len; dev->stats.rx_packets++; -kfree_skb (local_skb); -kfree_skb (skb); +consume_skb (local_skb); +consume_skb (skb); }else {switch (skb->data[0 ] &0xe0 ) {case LOWPAN_DISPATCH_IPHC :/* ipv6 datagram */
@@ -363,7 +363,8 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev, dev->stats.rx_bytes += skb->len; dev->stats.rx_packets++; -kfree_skb (skb); +consume_skb (local_skb); +consume_skb (skb);break ;default :break ;
Signature · 1 line
1.9.1
PATCH v5 4/4 ieee802154: 6lowpan: rename process_data and lowpan_process_data
In reply to Martin TownsendFrom: Martin Townsend <[email protected]>
As we have decouple decompression from data delivery we can now rename all occurences of process_data in receive path.
--- include/net/6lowpan.h | 10 ++++++---- net/6lowpan/iphc.c | 12 +++++++----- net/bluetooth/6lowpan.c | 15 ++++++++------- net/ieee802154/6lowpan_rtnl.c | 15 ++++++++------- 4 files changed, 29 insertions(+), 23 deletions(-)
include/net/6lowpan.h +6 -4
@@ -372,10 +372,12 @@ lowpan_uncompress_size(const struct sk_buff *skb, u16 *dgram_offset)return skb->len + uncomp_header - ret; } -int lowpan_process_data (struct sk_buff *skb,struct net_device *dev, -const u8 *saddr,const u8 saddr_type,const u8 saddr_len, -const u8 *daddr,const u8 daddr_type,const u8 daddr_len, -u8 iphc0,u8 iphc1); +int +lowpan_header_decompress (struct sk_buff *skb,struct net_device *dev, +const u8 *saddr,const u8 saddr_type, +const u8 saddr_len,const u8 *daddr, +const u8 daddr_type,const u8 daddr_len, +u8 iphc0,u8 iphc1);int lowpan_header_compress (struct sk_buff *skb,struct net_device *dev,unsigned short type,const void *_daddr,const void *_saddr,unsigned int len);
net/6lowpan/iphc.c +7 -5
@@ -301,10 +301,12 @@ err:/* TTL uncompression values */ static const u8 lowpan_ttl_values[] = {0 ,1 ,64 ,255 }; -int lowpan_process_data (struct sk_buff *skb,struct net_device *dev, -const u8 *saddr,const u8 saddr_type,const u8 saddr_len, -const u8 *daddr,const u8 daddr_type,const u8 daddr_len, -u8 iphc0,u8 iphc1) +int +lowpan_header_decompress (struct sk_buff *skb,struct net_device *dev, +const u8 *saddr,const u8 saddr_type, +const u8 saddr_len,const u8 *daddr, +const u8 daddr_type,const u8 daddr_len, +u8 iphc0,u8 iphc1) {struct ipv6hdr hdr = {};u8 tmp, num_context =0 ;
@@ -480,7 +482,7 @@ drop:kfree_skb (skb);return -EINVAL ; } -EXPORT_SYMBOL_GPL (lowpan_process_data); +EXPORT_SYMBOL_GPL (lowpan_header_decompress); static u8 lowpan_compress_addr_64(u8 **hc_ptr, u8 shift, const struct in6_addr *ipaddr,
net/bluetooth/6lowpan.c +8 -7
@@ -257,8 +257,8 @@ static int give_skb_to_upper(struct sk_buff *skb, struct net_device *dev)return netif_rx (skb_cp); } -static int process_data (struct sk_buff *skb,struct net_device *netdev, -struct l2cap_chan *chan) +static int iphc_decompress (struct sk_buff *skb,struct net_device *netdev, +struct l2cap_chan *chan) {const u8 *saddr, *daddr;u8 iphc0, iphc1;
@@ -287,10 +287,11 @@ static int process_data(struct sk_buff *skb, struct net_device *netdev,if (lowpan_fetch_skb_u8 (skb, &iphc1)) goto drop; -return lowpan_process_data (skb, netdev, - saddr,IEEE802154_ADDR_LONG ,EUI64_ADDR_LEN , - daddr,IEEE802154_ADDR_LONG ,EUI64_ADDR_LEN , - iphc0, iphc1); +return lowpan_header_decompress (skb, netdev, + saddr,IEEE802154_ADDR_LONG , +EUI64_ADDR_LEN , daddr, +IEEE802154_ADDR_LONG ,EUI64_ADDR_LEN , + iphc0, iphc1); drop:kfree_skb (skb);
@@ -346,7 +347,7 @@ static int recv_pkt(struct sk_buff *skb, struct net_device *dev,if (!local_skb) goto drop; - ret =process_data (local_skb, dev, chan); + ret =iphc_decompress (local_skb, dev, chan);if (ret <0 ) goto drop;
net/ieee802154/6lowpan_rtnl.c +8 -7
@@ -166,7 +166,8 @@ static int lowpan_give_skb_to_devices(struct sk_buff *skb,return stat; } -static int process_data (struct sk_buff *skb,const struct ieee802154_hdr *hdr) +static int +iphc_decompress (struct sk_buff *skb,const struct ieee802154_hdr *hdr) {u8 iphc0, iphc1;struct ieee802154_addr_sa sa, da;
@@ -196,9 +197,9 @@ static int process_data(struct sk_buff *skb, const struct ieee802154_hdr *hdr)else dap = &da.hwaddr; -return lowpan_process_data (skb, skb->dev, sap, sa.addr_type, -IEEE802154_ADDR_LEN , dap, da.addr_type, -IEEE802154_ADDR_LEN , iphc0, iphc1); +return lowpan_header_decompress (skb, skb->dev, sap, sa.addr_type, +IEEE802154_ADDR_LEN , dap, da.addr_type, +IEEE802154_ADDR_LEN , iphc0, iphc1); drop:kfree_skb (skb);
@@ -541,7 +542,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev, }else {switch (skb->data[0 ] &0xe0 ) {case LOWPAN_DISPATCH_IPHC :/* ipv6 datagram */ - ret =process_data (skb, &hdr); + ret =iphc_decompress (skb, &hdr);if (ret <0 ) goto drop;
@@ -549,7 +550,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,case LOWPAN_DISPATCH_FRAG1 :/* first fragment header */ ret =lowpan_frag_rcv (skb,LOWPAN_DISPATCH_FRAG1 );if (ret ==1 ) { - ret =process_data (skb, &hdr); + ret =iphc_decompress (skb, &hdr);if (ret <0 ) goto drop;
@@ -562,7 +563,7 @@ static int lowpan_rcv(struct sk_buff *skb, struct net_device *dev,case LOWPAN_DISPATCH_FRAGN :/* next fragments headers */ ret =lowpan_frag_rcv (skb,LOWPAN_DISPATCH_FRAGN );if (ret ==1 ) { - ret =process_data (skb, &hdr); + ret =iphc_decompress (skb, &hdr);if (ret <0 ) goto drop;
Signature · 1 line
1.9.1
Quoted 7 lines · Martin Townsend
This series moves skb delivery out of IPHC and into the receive routines of both bluetooth and 802.15.4. The reason is that we need to support more (de)compression schemes in the future. It also means that calling
lowpan_process_datanow only returns error codes or 0 for success so this has been cleaned up. The final patch then renames occurences oflowpan_process_dataandprocess_datato something more meaningful.
on the complete serie.
- Alex
Jukka Rissanen
Acked-byQuoted 9 lines · Alexander Aring
Quoted 7 lines · Martin Townsend
This series moves skb delivery out of IPHC and into the receive routines of both bluetooth and 802.15.4. The reason is that we need to support more (de)compression schemes in the future. It also means that calling
lowpan_process_datanow only returns error codes or 0 for success so this has been cleaned up. The final patch then renames occurences oflowpan_process_dataandprocess_datato something more meaningful.
Quoted 5 lines
Acked-by Alexander Aring <[email protected]>on the complete serie.
- Alex
Tested this with Bluetooth 6lowpan and everything works just fine so ack also from me.
Cheers,
Jukka
Marcel Holtmann
maintainerHi Martin,
Quoted 35 lines
This series moves skb delivery out of IPHC and into the receive routines of both bluetooth and 802.15.4. The reason is that we need to support more (de)compression schemes in the future. It also means that calling
lowpan_process_datanow only returns error codes or 0 for success so this has been cleaned up. The final patch then renames occurences oflowpan_process_dataandprocess_datato something more meaningful.v1 -> v2
* Handle freeing of skb in
lowpan_give_skb_to_devicesfor 802.15.14
* Added anotherskb_consumein bluetooth code for uncompressed IPv6 headers
* Added missingskb_consumeforlocal_skbfor bluetooth in compreesed IPv6 header path
* Combine patch 4 into 1.v2 -> v3
* Ensure error codes aren't returned in the bluetooth skb delivery function.
* Inlowpan_give_skb_to_devicesreturnNET_RX_DROPwhen the first call tonetif_rxfails.v3 -> v4
* Fixed incorrect frag return handling due to refactoring
skb_deliver.v4 -> v5
* Removed unnecessary break statements in
lowpan_rcvMartin Townsend (4):
6lowpan: removeskb_deliverfrom IPHC
6lowpan: fixprocess_datareturn values
bluetooth:6lowpan: useconsume_skbwhen packet processed successfully
ieee802154: 6lowpan: renameprocess_dataandlowpan_process_data
Quoted 5 lines
include/net/6lowpan.h | 12 ++++----- net/6lowpan/iphc.c | 42 +++++++++--------------------- net/bluetooth/6lowpan.c | 36 +++++++++++++++++--------- net/ieee802154/6lowpan_rtnl.c | 60 ++++++++++++++++++++++++++----------------- 4 files changed, 78 insertions(+), 72 deletions(-)
all 4 patches have been applied to bluetooth-next tree.
Regards
Marcel