aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Aring <alex.aring@gmail.com>2015-08-10 15:15:58 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-08-10 14:43:06 -0400
commitc91208d819c814e7f418c7a083059cf533ad0396 (patch)
treea74fb8a149dcdbecfd7ebcb7feefaeaa5d6764ce
parentfc0719e6a144402197a2147117f10b66ee623fbb (diff)
ieee802154: add ack request default handling
This patch introduce a new mib entry which isn't part of 802.15.4 but useful as default behaviour to set the ack request bit or not if we don't know if the ack request bit should set. This is currently used for stacks like IEEE 802.15.4 6LoWPAN. Reviewed-by: Stefan Schmidt <stefan@osg.samsung.com> Signed-off-by: Alexander Aring <alex.aring@gmail.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--include/net/cfg802154.h5
-rw-r--r--include/net/nl802154.h4
-rw-r--r--net/ieee802154/6lowpan/tx.c2
-rw-r--r--net/ieee802154/nl802154.c33
-rw-r--r--net/ieee802154/rdev-ops.h13
-rw-r--r--net/ieee802154/trace.h19
-rw-r--r--net/mac802154/cfg.c11
7 files changed, 86 insertions, 1 deletions
diff --git a/include/net/cfg802154.h b/include/net/cfg802154.h
index e53b6bfda976..76b1ffaea863 100644
--- a/include/net/cfg802154.h
+++ b/include/net/cfg802154.h
@@ -63,6 +63,8 @@ struct cfg802154_ops {
63 s8 max_frame_retries); 63 s8 max_frame_retries);
64 int (*set_lbt_mode)(struct wpan_phy *wpan_phy, 64 int (*set_lbt_mode)(struct wpan_phy *wpan_phy,
65 struct wpan_dev *wpan_dev, bool mode); 65 struct wpan_dev *wpan_dev, bool mode);
66 int (*set_ackreq_default)(struct wpan_phy *wpan_phy,
67 struct wpan_dev *wpan_dev, bool ackreq);
66}; 68};
67 69
68static inline bool 70static inline bool
@@ -196,6 +198,9 @@ struct wpan_dev {
196 bool lbt; 198 bool lbt;
197 199
198 bool promiscuous_mode; 200 bool promiscuous_mode;
201
202 /* fallback for acknowledgment bit setting */
203 bool ackreq;
199}; 204};
200 205
201#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev) 206#define to_phy(_dev) container_of(_dev, struct wpan_phy, dev)
diff --git a/include/net/nl802154.h b/include/net/nl802154.h
index b0ab530d28cd..cf2713d8b975 100644
--- a/include/net/nl802154.h
+++ b/include/net/nl802154.h
@@ -52,6 +52,8 @@ enum nl802154_commands {
52 52
53 NL802154_CMD_SET_LBT_MODE, 53 NL802154_CMD_SET_LBT_MODE,
54 54
55 NL802154_CMD_SET_ACKREQ_DEFAULT,
56
55 /* add new commands above here */ 57 /* add new commands above here */
56 58
57 /* used to define NL802154_CMD_MAX below */ 59 /* used to define NL802154_CMD_MAX below */
@@ -104,6 +106,8 @@ enum nl802154_attrs {
104 106
105 NL802154_ATTR_SUPPORTED_COMMANDS, 107 NL802154_ATTR_SUPPORTED_COMMANDS,
106 108
109 NL802154_ATTR_ACKREQ_DEFAULT,
110
107 /* add attributes here, update the policy in nl802154.c */ 111 /* add attributes here, update the policy in nl802154.c */
108 112
109 __NL802154_ATTR_AFTER_LAST, 113 __NL802154_ATTR_AFTER_LAST,
diff --git a/net/ieee802154/6lowpan/tx.c b/net/ieee802154/6lowpan/tx.c
index 2597abbf7f4b..1bf4a304b5c4 100644
--- a/net/ieee802154/6lowpan/tx.c
+++ b/net/ieee802154/6lowpan/tx.c
@@ -224,7 +224,7 @@ static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
224 } else { 224 } else {
225 da.mode = IEEE802154_ADDR_LONG; 225 da.mode = IEEE802154_ADDR_LONG;
226 da.extended_addr = ieee802154_devaddr_from_raw(daddr); 226 da.extended_addr = ieee802154_devaddr_from_raw(daddr);
227 cb->ackreq = wpan_dev->frame_retries >= 0; 227 cb->ackreq = wpan_dev->ackreq;
228 } 228 }
229 229
230 return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev, 230 return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
diff --git a/net/ieee802154/nl802154.c b/net/ieee802154/nl802154.c
index 68f24016860c..1b00a14850cb 100644
--- a/net/ieee802154/nl802154.c
+++ b/net/ieee802154/nl802154.c
@@ -230,6 +230,8 @@ static const struct nla_policy nl802154_policy[NL802154_ATTR_MAX+1] = {
230 [NL802154_ATTR_WPAN_PHY_CAPS] = { .type = NLA_NESTED }, 230 [NL802154_ATTR_WPAN_PHY_CAPS] = { .type = NLA_NESTED },
231 231
232 [NL802154_ATTR_SUPPORTED_COMMANDS] = { .type = NLA_NESTED }, 232 [NL802154_ATTR_SUPPORTED_COMMANDS] = { .type = NLA_NESTED },
233
234 [NL802154_ATTR_ACKREQ_DEFAULT] = { .type = NLA_U8 },
233}; 235};
234 236
235/* message building helper */ 237/* message building helper */
@@ -458,6 +460,7 @@ static int nl802154_send_wpan_phy(struct cfg802154_registered_device *rdev,
458 CMD(set_max_csma_backoffs, SET_MAX_CSMA_BACKOFFS); 460 CMD(set_max_csma_backoffs, SET_MAX_CSMA_BACKOFFS);
459 CMD(set_max_frame_retries, SET_MAX_FRAME_RETRIES); 461 CMD(set_max_frame_retries, SET_MAX_FRAME_RETRIES);
460 CMD(set_lbt_mode, SET_LBT_MODE); 462 CMD(set_lbt_mode, SET_LBT_MODE);
463 CMD(set_ackreq_default, SET_ACKREQ_DEFAULT);
461 464
462 if (rdev->wpan_phy.flags & WPAN_PHY_FLAG_TXPOWER) 465 if (rdev->wpan_phy.flags & WPAN_PHY_FLAG_TXPOWER)
463 CMD(set_tx_power, SET_TX_POWER); 466 CMD(set_tx_power, SET_TX_POWER);
@@ -656,6 +659,10 @@ nl802154_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flags,
656 if (nla_put_u8(msg, NL802154_ATTR_LBT_MODE, wpan_dev->lbt)) 659 if (nla_put_u8(msg, NL802154_ATTR_LBT_MODE, wpan_dev->lbt))
657 goto nla_put_failure; 660 goto nla_put_failure;
658 661
662 /* ackreq default behaviour */
663 if (nla_put_u8(msg, NL802154_ATTR_ACKREQ_DEFAULT, wpan_dev->ackreq))
664 goto nla_put_failure;
665
659 genlmsg_end(msg, hdr); 666 genlmsg_end(msg, hdr);
660 return 0; 667 return 0;
661 668
@@ -1042,6 +1049,24 @@ static int nl802154_set_lbt_mode(struct sk_buff *skb, struct genl_info *info)
1042 return rdev_set_lbt_mode(rdev, wpan_dev, mode); 1049 return rdev_set_lbt_mode(rdev, wpan_dev, mode);
1043} 1050}
1044 1051
1052static int
1053nl802154_set_ackreq_default(struct sk_buff *skb, struct genl_info *info)
1054{
1055 struct cfg802154_registered_device *rdev = info->user_ptr[0];
1056 struct net_device *dev = info->user_ptr[1];
1057 struct wpan_dev *wpan_dev = dev->ieee802154_ptr;
1058 bool ackreq;
1059
1060 if (netif_running(dev))
1061 return -EBUSY;
1062
1063 if (!info->attrs[NL802154_ATTR_ACKREQ_DEFAULT])
1064 return -EINVAL;
1065
1066 ackreq = !!nla_get_u8(info->attrs[NL802154_ATTR_ACKREQ_DEFAULT]);
1067 return rdev_set_ackreq_default(rdev, wpan_dev, ackreq);
1068}
1069
1045#define NL802154_FLAG_NEED_WPAN_PHY 0x01 1070#define NL802154_FLAG_NEED_WPAN_PHY 0x01
1046#define NL802154_FLAG_NEED_NETDEV 0x02 1071#define NL802154_FLAG_NEED_NETDEV 0x02
1047#define NL802154_FLAG_NEED_RTNL 0x04 1072#define NL802154_FLAG_NEED_RTNL 0x04
@@ -1248,6 +1273,14 @@ static const struct genl_ops nl802154_ops[] = {
1248 .internal_flags = NL802154_FLAG_NEED_NETDEV | 1273 .internal_flags = NL802154_FLAG_NEED_NETDEV |
1249 NL802154_FLAG_NEED_RTNL, 1274 NL802154_FLAG_NEED_RTNL,
1250 }, 1275 },
1276 {
1277 .cmd = NL802154_CMD_SET_ACKREQ_DEFAULT,
1278 .doit = nl802154_set_ackreq_default,
1279 .policy = nl802154_policy,
1280 .flags = GENL_ADMIN_PERM,
1281 .internal_flags = NL802154_FLAG_NEED_NETDEV |
1282 NL802154_FLAG_NEED_RTNL,
1283 },
1251}; 1284};
1252 1285
1253/* initialisation/exit functions */ 1286/* initialisation/exit functions */
diff --git a/net/ieee802154/rdev-ops.h b/net/ieee802154/rdev-ops.h
index 8d5960a37195..03b357501cc5 100644
--- a/net/ieee802154/rdev-ops.h
+++ b/net/ieee802154/rdev-ops.h
@@ -195,4 +195,17 @@ rdev_set_lbt_mode(struct cfg802154_registered_device *rdev,
195 return ret; 195 return ret;
196} 196}
197 197
198static inline int
199rdev_set_ackreq_default(struct cfg802154_registered_device *rdev,
200 struct wpan_dev *wpan_dev, bool ackreq)
201{
202 int ret;
203
204 trace_802154_rdev_set_ackreq_default(&rdev->wpan_phy, wpan_dev,
205 ackreq);
206 ret = rdev->ops->set_ackreq_default(&rdev->wpan_phy, wpan_dev, ackreq);
207 trace_802154_rdev_return_int(&rdev->wpan_phy, ret);
208 return ret;
209}
210
198#endif /* __CFG802154_RDEV_OPS */ 211#endif /* __CFG802154_RDEV_OPS */
diff --git a/net/ieee802154/trace.h b/net/ieee802154/trace.h
index 4399b7fbaa31..9a471e41ec73 100644
--- a/net/ieee802154/trace.h
+++ b/net/ieee802154/trace.h
@@ -275,6 +275,25 @@ TRACE_EVENT(802154_rdev_set_lbt_mode,
275 WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->mode)) 275 WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->mode))
276); 276);
277 277
278TRACE_EVENT(802154_rdev_set_ackreq_default,
279 TP_PROTO(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
280 bool ackreq),
281 TP_ARGS(wpan_phy, wpan_dev, ackreq),
282 TP_STRUCT__entry(
283 WPAN_PHY_ENTRY
284 WPAN_DEV_ENTRY
285 __field(bool, ackreq)
286 ),
287 TP_fast_assign(
288 WPAN_PHY_ASSIGN;
289 WPAN_DEV_ASSIGN;
290 __entry->ackreq = ackreq;
291 ),
292 TP_printk(WPAN_PHY_PR_FMT ", " WPAN_DEV_PR_FMT
293 ", ackreq default: %s", WPAN_PHY_PR_ARG,
294 WPAN_DEV_PR_ARG, BOOL_TO_STR(__entry->ackreq))
295);
296
278TRACE_EVENT(802154_rdev_return_int, 297TRACE_EVENT(802154_rdev_return_int,
279 TP_PROTO(struct wpan_phy *wpan_phy, int ret), 298 TP_PROTO(struct wpan_phy *wpan_phy, int ret),
280 TP_ARGS(wpan_phy, ret), 299 TP_ARGS(wpan_phy, ret),
diff --git a/net/mac802154/cfg.c b/net/mac802154/cfg.c
index cecfcda09aac..c865ebb2ace2 100644
--- a/net/mac802154/cfg.c
+++ b/net/mac802154/cfg.c
@@ -256,6 +256,16 @@ ieee802154_set_lbt_mode(struct wpan_phy *wpan_phy, struct wpan_dev *wpan_dev,
256 return 0; 256 return 0;
257} 257}
258 258
259static int
260ieee802154_set_ackreq_default(struct wpan_phy *wpan_phy,
261 struct wpan_dev *wpan_dev, bool ackreq)
262{
263 ASSERT_RTNL();
264
265 wpan_dev->ackreq = ackreq;
266 return 0;
267}
268
259const struct cfg802154_ops mac802154_config_ops = { 269const struct cfg802154_ops mac802154_config_ops = {
260 .add_virtual_intf_deprecated = ieee802154_add_iface_deprecated, 270 .add_virtual_intf_deprecated = ieee802154_add_iface_deprecated,
261 .del_virtual_intf_deprecated = ieee802154_del_iface_deprecated, 271 .del_virtual_intf_deprecated = ieee802154_del_iface_deprecated,
@@ -273,4 +283,5 @@ const struct cfg802154_ops mac802154_config_ops = {
273 .set_max_csma_backoffs = ieee802154_set_max_csma_backoffs, 283 .set_max_csma_backoffs = ieee802154_set_max_csma_backoffs,
274 .set_max_frame_retries = ieee802154_set_max_frame_retries, 284 .set_max_frame_retries = ieee802154_set_max_frame_retries,
275 .set_lbt_mode = ieee802154_set_lbt_mode, 285 .set_lbt_mode = ieee802154_set_lbt_mode,
286 .set_ackreq_default = ieee802154_set_ackreq_default,
276}; 287};