@@ -187,8 +187,8 @@ static const struct nla_policy nl802154_policy[NL802154_ATTR_MAX+1] = {
187
187
188
188
[NL802154_ATTR_WPAN_DEV ] = { .type = NLA_U64 },
189
189
190
- [NL802154_ATTR_PAGE ] = { . type = NLA_U8 , } ,
191
- [NL802154_ATTR_CHANNEL ] = { . type = NLA_U8 , } ,
190
+ [NL802154_ATTR_PAGE ] = NLA_POLICY_MAX ( NLA_U8 , IEEE802154_MAX_PAGE ) ,
191
+ [NL802154_ATTR_CHANNEL ] = NLA_POLICY_MAX ( NLA_U8 , IEEE802154_MAX_CHANNEL ) ,
192
192
193
193
[NL802154_ATTR_TX_POWER ] = { .type = NLA_S32 , },
194
194
@@ -221,13 +221,19 @@ static const struct nla_policy nl802154_policy[NL802154_ATTR_MAX+1] = {
221
221
222
222
[NL802154_ATTR_COORDINATOR ] = { .type = NLA_NESTED },
223
223
224
- [NL802154_ATTR_SCAN_TYPE ] = { .type = NLA_U8 },
225
- [NL802154_ATTR_SCAN_CHANNELS ] = { .type = NLA_U32 },
226
- [NL802154_ATTR_SCAN_PREAMBLE_CODES ] = { .type = NLA_U64 },
227
- [NL802154_ATTR_SCAN_MEAN_PRF ] = { .type = NLA_U8 },
228
- [NL802154_ATTR_SCAN_DURATION ] = { .type = NLA_U8 },
229
- [NL802154_ATTR_SCAN_DONE_REASON ] = { .type = NLA_U8 },
230
- [NL802154_ATTR_BEACON_INTERVAL ] = { .type = NLA_U8 },
224
+ [NL802154_ATTR_SCAN_TYPE ] =
225
+ NLA_POLICY_RANGE (NLA_U8 , NL802154_SCAN_ED , NL802154_SCAN_RIT_PASSIVE ),
226
+ [NL802154_ATTR_SCAN_CHANNELS ] =
227
+ NLA_POLICY_MASK (NLA_U32 , GENMASK (IEEE802154_MAX_CHANNEL , 0 )),
228
+ [NL802154_ATTR_SCAN_PREAMBLE_CODES ] = { .type = NLA_REJECT },
229
+ [NL802154_ATTR_SCAN_MEAN_PRF ] = { .type = NLA_REJECT },
230
+ [NL802154_ATTR_SCAN_DURATION ] =
231
+ NLA_POLICY_MAX (NLA_U8 , IEEE802154_MAX_SCAN_DURATION ),
232
+ [NL802154_ATTR_SCAN_DONE_REASON ] =
233
+ NLA_POLICY_RANGE (NLA_U8 , NL802154_SCAN_DONE_REASON_FINISHED ,
234
+ NL802154_SCAN_DONE_REASON_ABORTED ),
235
+ [NL802154_ATTR_BEACON_INTERVAL ] =
236
+ NLA_POLICY_MAX (NLA_U8 , IEEE802154_MAX_SCAN_DURATION ),
231
237
232
238
#ifdef CONFIG_IEEE802154_NL802154_EXPERIMENTAL
233
239
[NL802154_ATTR_SEC_ENABLED ] = { .type = NLA_U8 , },
@@ -1423,51 +1429,23 @@ static int nl802154_trigger_scan(struct sk_buff *skb, struct genl_info *info)
1423
1429
goto free_request ;
1424
1430
}
1425
1431
1426
- if (info -> attrs [NL802154_ATTR_PAGE ]) {
1432
+ /* Use current page by default */
1433
+ if (info -> attrs [NL802154_ATTR_PAGE ])
1427
1434
request -> page = nla_get_u8 (info -> attrs [NL802154_ATTR_PAGE ]);
1428
- if (request -> page > IEEE802154_MAX_PAGE ) {
1429
- pr_err ("Invalid page %d > %d\n" ,
1430
- request -> page , IEEE802154_MAX_PAGE );
1431
- err = - EINVAL ;
1432
- goto free_request ;
1433
- }
1434
- } else {
1435
- /* Use current page by default */
1435
+ else
1436
1436
request -> page = wpan_phy -> current_page ;
1437
- }
1438
1437
1439
- if (info -> attrs [NL802154_ATTR_SCAN_CHANNELS ]) {
1438
+ /* Scan all supported channels by default */
1439
+ if (info -> attrs [NL802154_ATTR_SCAN_CHANNELS ])
1440
1440
request -> channels = nla_get_u32 (info -> attrs [NL802154_ATTR_SCAN_CHANNELS ]);
1441
- if (request -> channels >= BIT (IEEE802154_MAX_CHANNEL + 1 )) {
1442
- pr_err ("Invalid channels bitfield %x ≥ %lx\n" ,
1443
- request -> channels ,
1444
- BIT (IEEE802154_MAX_CHANNEL + 1 ));
1445
- err = - EINVAL ;
1446
- goto free_request ;
1447
- }
1448
- } else {
1449
- /* Scan all supported channels by default */
1441
+ else
1450
1442
request -> channels = wpan_phy -> supported .channels [request -> page ];
1451
- }
1452
-
1453
- if (info -> attrs [NL802154_ATTR_SCAN_PREAMBLE_CODES ] ||
1454
- info -> attrs [NL802154_ATTR_SCAN_MEAN_PRF ]) {
1455
- pr_err ("Preamble codes and mean PRF not supported yet\n" );
1456
- err = - EINVAL ;
1457
- goto free_request ;
1458
- }
1459
1443
1460
- if (info -> attrs [NL802154_ATTR_SCAN_DURATION ]) {
1444
+ /* Use maximum duration order by default */
1445
+ if (info -> attrs [NL802154_ATTR_SCAN_DURATION ])
1461
1446
request -> duration = nla_get_u8 (info -> attrs [NL802154_ATTR_SCAN_DURATION ]);
1462
- if (request -> duration > IEEE802154_MAX_SCAN_DURATION ) {
1463
- pr_err ("Duration is out of range\n" );
1464
- err = - EINVAL ;
1465
- goto free_request ;
1466
- }
1467
- } else {
1468
- /* Use maximum duration order by default */
1447
+ else
1469
1448
request -> duration = IEEE802154_MAX_SCAN_DURATION ;
1470
- }
1471
1449
1472
1450
if (wpan_dev -> netdev )
1473
1451
dev_hold (wpan_dev -> netdev );
@@ -1614,17 +1592,11 @@ nl802154_send_beacons(struct sk_buff *skb, struct genl_info *info)
1614
1592
request -> wpan_dev = wpan_dev ;
1615
1593
request -> wpan_phy = wpan_phy ;
1616
1594
1617
- if (info -> attrs [NL802154_ATTR_BEACON_INTERVAL ]) {
1595
+ /* Use maximum duration order by default */
1596
+ if (info -> attrs [NL802154_ATTR_BEACON_INTERVAL ])
1618
1597
request -> interval = nla_get_u8 (info -> attrs [NL802154_ATTR_BEACON_INTERVAL ]);
1619
- if (request -> interval > IEEE802154_MAX_SCAN_DURATION ) {
1620
- pr_err ("Interval is out of range\n" );
1621
- err = - EINVAL ;
1622
- goto free_request ;
1623
- }
1624
- } else {
1625
- /* Use maximum duration order by default */
1598
+ else
1626
1599
request -> interval = IEEE802154_MAX_SCAN_DURATION ;
1627
- }
1628
1600
1629
1601
if (wpan_dev -> netdev )
1630
1602
dev_hold (wpan_dev -> netdev );
@@ -1640,7 +1612,7 @@ nl802154_send_beacons(struct sk_buff *skb, struct genl_info *info)
1640
1612
free_device :
1641
1613
if (wpan_dev -> netdev )
1642
1614
dev_put (wpan_dev -> netdev );
1643
- free_request :
1615
+
1644
1616
kfree (request );
1645
1617
1646
1618
return err ;
0 commit comments