Commit a1da67b8 authored by Alexander Aring's avatar Alexander Aring Committed by Marcel Holtmann

ieee802154: header_ops: fix frame control setting

Sometimes upper-layer protocols wants to generate a new mac header by
filling "struct ieee802154_hdr" only. These upper-layers sets for the
address settings the source and dest fields, but not the fc fields for
indicate the source and dest address mode. This patch changes the
"ieee802154_hdr_push" function so the fc address fields are set
according the source and dest fields of "struct ieee802154_hdr".
Signed-off-by: default avatarAlexander Aring <alex.aring@gmail.com>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent cdd38b21
...@@ -99,7 +99,7 @@ struct ieee802154_hdr { ...@@ -99,7 +99,7 @@ struct ieee802154_hdr {
* hdr->fc will be ignored. this includes the INTRA_PAN bit and the frame * hdr->fc will be ignored. this includes the INTRA_PAN bit and the frame
* version, if SECEN is set. * version, if SECEN is set.
*/ */
int ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr); int ieee802154_hdr_push(struct sk_buff *skb, struct ieee802154_hdr *hdr);
/* pulls the entire 802.15.4 header off of the skb, including the security /* pulls the entire 802.15.4 header off of the skb, including the security
* header, and performs pan id decompression * header, and performs pan id decompression
......
...@@ -83,35 +83,35 @@ ieee802154_hdr_push_sechdr(u8 *buf, const struct ieee802154_sechdr *hdr) ...@@ -83,35 +83,35 @@ ieee802154_hdr_push_sechdr(u8 *buf, const struct ieee802154_sechdr *hdr)
} }
int int
ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr) ieee802154_hdr_push(struct sk_buff *skb, struct ieee802154_hdr *hdr)
{ {
u8 buf[MAC802154_FRAME_HARD_HEADER_LEN]; u8 buf[MAC802154_FRAME_HARD_HEADER_LEN];
int pos = 2; int pos = 2;
int rc; int rc;
struct ieee802154_hdr_fc fc = hdr->fc; struct ieee802154_hdr_fc *fc = &hdr->fc;
buf[pos++] = hdr->seq; buf[pos++] = hdr->seq;
fc.dest_addr_mode = hdr->dest.mode; fc->dest_addr_mode = hdr->dest.mode;
rc = ieee802154_hdr_push_addr(buf + pos, &hdr->dest, false); rc = ieee802154_hdr_push_addr(buf + pos, &hdr->dest, false);
if (rc < 0) if (rc < 0)
return -EINVAL; return -EINVAL;
pos += rc; pos += rc;
fc.source_addr_mode = hdr->source.mode; fc->source_addr_mode = hdr->source.mode;
if (hdr->source.pan_id == hdr->dest.pan_id && if (hdr->source.pan_id == hdr->dest.pan_id &&
hdr->dest.mode != IEEE802154_ADDR_NONE) hdr->dest.mode != IEEE802154_ADDR_NONE)
fc.intra_pan = true; fc->intra_pan = true;
rc = ieee802154_hdr_push_addr(buf + pos, &hdr->source, fc.intra_pan); rc = ieee802154_hdr_push_addr(buf + pos, &hdr->source, fc->intra_pan);
if (rc < 0) if (rc < 0)
return -EINVAL; return -EINVAL;
pos += rc; pos += rc;
if (fc.security_enabled) { if (fc->security_enabled) {
fc.version = 1; fc->version = 1;
rc = ieee802154_hdr_push_sechdr(buf + pos, &hdr->sec); rc = ieee802154_hdr_push_sechdr(buf + pos, &hdr->sec);
if (rc < 0) if (rc < 0)
...@@ -120,7 +120,7 @@ ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr) ...@@ -120,7 +120,7 @@ ieee802154_hdr_push(struct sk_buff *skb, const struct ieee802154_hdr *hdr)
pos += rc; pos += rc;
} }
memcpy(buf, &fc, 2); memcpy(buf, fc, 2);
memcpy(skb_push(skb, pos), buf, pos); memcpy(skb_push(skb, pos), buf, pos);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment