On 11/2/11, Alexander Smirnov <alex.bluesman.smir...@gmail.com> wrote: > This patch provides possibility to decompress UDP headers. > Derived from Contiki OS.
This asks to go to a separate function. > > Signed-off-by: Alexander Smirnov <alex.bluesman.smir...@gmail.com> > --- > net/ieee802154/6lowpan.c | 50 > +++++++++++++++++++++++++++++++++++++++++++++- > 1 files changed, 49 insertions(+), 1 deletions(-) > > diff --git a/net/ieee802154/6lowpan.c b/net/ieee802154/6lowpan.c > index 6da3357..49f42a8 100644 > --- a/net/ieee802154/6lowpan.c > +++ b/net/ieee802154/6lowpan.c > @@ -839,7 +839,55 @@ lowpan_process_data(struct sk_buff *skb) > goto drop; > } > > - /* TODO: UDP header parse */ > + /* UDP data uncompression */ > + if (iphc0 & LOWPAN_IPHC_NH_C) { > + tmp = lowpan_fetch_skb_u8(skb); > + > + if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { > + struct udphdr *uh = udp_hdr(skb); > + > + pr_debug("(%s): UDP header uncompression\n", __func__); > + switch (tmp & LOWPAN_NHC_UDP_CS_P_11) { > + case LOWPAN_NHC_UDP_CS_P_00: > + memcpy(&uh->source, &skb->data[0], 2); > + memcpy(&uh->dest, &skb->data[2], 2); > + skb_pull(skb, 4); > + break; > + case LOWPAN_NHC_UDP_CS_P_01: > + memcpy(&uh->source, &skb->data[0], 2); > + uh->dest = > + skb->data[2] + LOWPAN_NHC_UDP_8BIT_PORT; > + skb_pull(skb, 3); > + break; > + case LOWPAN_NHC_UDP_CS_P_10: > + uh->source = skb->data[0] + > LOWPAN_NHC_UDP_8BIT_PORT; > + memcpy(&uh->dest, &skb->data[1], 2); > + skb_pull(skb, 3); > + break; > + case LOWPAN_NHC_UDP_CS_P_11: > + uh->source = > + LOWPAN_NHC_UDP_4BIT_PORT + (skb->data[0] >> > 4); > + uh->dest = > + LOWPAN_NHC_UDP_4BIT_PORT + (skb->data[0] & > 0x0f); > + skb_pull(skb, 1); > + break; > + default: > + pr_debug("(%s) ERROR: unknown UDP format\n", > __func__); > + goto drop; > + } > + > + pr_debug("(%s): uncompressed UDP ports: src = %d, dst = > %d\n", > + __func__, uh->source, uh->dest); > + > + /* copy checksum */ > + memcpy(&uh->check, &skb->data[0], 2); > + skb_pull(skb, 2); > + } else { > + pr_debug("(%s): ERROR: unsupported NH format\n", > + __func__); > + goto drop; > + } > + } > > /* Not fragmented package */ > hdr.payload_len = htons(skb->len); > -- > 1.7.2.5 > > -- With best wishes Dmitry ------------------------------------------------------------------------------ RSA(R) Conference 2012 Save $700 by Nov 18 Register now http://p.sf.net/sfu/rsa-sfdev2dev1 _______________________________________________ Linux-zigbee-devel mailing list Linux-zigbee-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-zigbee-devel