6lowpan: udp use lowpan_fetch_skb function

Cleanup the lowpan_uncompress_udp_header function to use the
lowpan_fetch_skb function.

Signed-off-by: Alexander Aring <alex.aring@gmail.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
This commit is contained in:
Alexander Aring 2013-12-17 14:21:26 +01:00 committed by Marcel Holtmann
parent 573701ce37
commit 1672a36b73

View File

@ -265,40 +265,37 @@ lowpan_uncompress_multicast_daddr(struct sk_buff *skb,
static int static int
uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh) uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
{ {
u8 tmp; bool fail;
u8 tmp = 0, val = 0;
if (!uh) if (!uh)
goto err; goto err;
if (lowpan_fetch_skb_u8(skb, &tmp)) fail = lowpan_fetch_skb(skb, &tmp, 1);
goto err;
if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) { if ((tmp & LOWPAN_NHC_UDP_MASK) == LOWPAN_NHC_UDP_ID) {
pr_debug("UDP header uncompression\n"); pr_debug("UDP header uncompression\n");
switch (tmp & LOWPAN_NHC_UDP_CS_P_11) { switch (tmp & LOWPAN_NHC_UDP_CS_P_11) {
case LOWPAN_NHC_UDP_CS_P_00: case LOWPAN_NHC_UDP_CS_P_00:
memcpy(&uh->source, &skb->data[0], 2); fail |= lowpan_fetch_skb(skb, &uh->source, 2);
memcpy(&uh->dest, &skb->data[2], 2); fail |= lowpan_fetch_skb(skb, &uh->dest, 2);
skb_pull(skb, 4);
break; break;
case LOWPAN_NHC_UDP_CS_P_01: case LOWPAN_NHC_UDP_CS_P_01:
memcpy(&uh->source, &skb->data[0], 2); fail |= lowpan_fetch_skb(skb, &uh->source, 2);
uh->dest = htons(skb->data[2] + fail |= lowpan_fetch_skb(skb, &val, 1);
LOWPAN_NHC_UDP_8BIT_PORT); uh->dest = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
skb_pull(skb, 3);
break; break;
case LOWPAN_NHC_UDP_CS_P_10: case LOWPAN_NHC_UDP_CS_P_10:
uh->source = htons(skb->data[0] + fail |= lowpan_fetch_skb(skb, &val, 1);
LOWPAN_NHC_UDP_8BIT_PORT); uh->source = htons(val + LOWPAN_NHC_UDP_8BIT_PORT);
memcpy(&uh->dest, &skb->data[1], 2); fail |= lowpan_fetch_skb(skb, &uh->dest, 2);
skb_pull(skb, 3);
break; break;
case LOWPAN_NHC_UDP_CS_P_11: case LOWPAN_NHC_UDP_CS_P_11:
fail |= lowpan_fetch_skb(skb, &val, 1);
uh->source = htons(LOWPAN_NHC_UDP_4BIT_PORT + uh->source = htons(LOWPAN_NHC_UDP_4BIT_PORT +
(skb->data[0] >> 4)); (val >> 4));
uh->dest = htons(LOWPAN_NHC_UDP_4BIT_PORT + uh->dest = htons(LOWPAN_NHC_UDP_4BIT_PORT +
(skb->data[0] & 0x0f)); (val & 0x0f));
skb_pull(skb, 1);
break; break;
default: default:
pr_debug("ERROR: unknown UDP format\n"); pr_debug("ERROR: unknown UDP format\n");
@ -314,8 +311,7 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
pr_debug_ratelimited("checksum elided currently not supported\n"); pr_debug_ratelimited("checksum elided currently not supported\n");
goto err; goto err;
} else { } else {
memcpy(&uh->check, &skb->data[0], 2); fail |= lowpan_fetch_skb(skb, &uh->check, 2);
skb_pull(skb, 2);
} }
/* /*
@ -330,6 +326,9 @@ uncompress_udp_header(struct sk_buff *skb, struct udphdr *uh)
goto err; goto err;
} }
if (fail)
goto err;
return 0; return 0;
err: err:
return -EINVAL; return -EINVAL;