1#include <net/if.h> 2#include <errno.h> 3#include <string.h> 4 5#include "nl80211.h" 6#include "iw.h" 7 8SECTION(ocb); 9 10static int join_ocb(struct nl80211_state *state, struct nl_cb *cb, 11 struct nl_msg *msg, int argc, char **argv, 12 enum id_input id) 13{ 14 unsigned long freq; 15 char *end; 16 int i; 17 static const struct { 18 const char *name; 19 unsigned int width; 20 } *chanmode_selected, chanmode[] = { 21 { .name = "5MHZ", 22 .width = NL80211_CHAN_WIDTH_5 }, 23 { .name = "10MHZ", 24 .width = NL80211_CHAN_WIDTH_10 }, 25 }; 26 27 if (argc < 2) 28 return 1; 29 30 /* freq */ 31 freq = strtoul(argv[0], &end, 10); 32 if (*end != '\0') 33 return 1; 34 35 NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); 36 argv++; 37 argc--; 38 39 /* channel width */ 40 for (i = 0; i < ARRAY_SIZE(chanmode); i++) { 41 if (strcasecmp(chanmode[i].name, argv[0]) == 0) { 42 chanmode_selected = &chanmode[i]; 43 break; 44 } 45 } 46 if (chanmode_selected) { 47 NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH, 48 chanmode_selected->width); 49 NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1, freq); 50 51 argv++; 52 argc--; 53 } else { 54 return 1; 55 } 56 57 return 0; 58 59nla_put_failure: 60 return -ENOBUFS; 61} 62COMMAND(ocb, join, "<freq in MHz> <5MHZ|10MHZ>", 63 NL80211_CMD_JOIN_OCB, 0, CIB_NETDEV, join_ocb, 64 "Join the OCB mode network."); 65 66static int leave_ocb(struct nl80211_state *state, struct nl_cb *cb, 67 struct nl_msg *msg, int argc, char **argv, 68 enum id_input id) 69{ 70 if (argc) 71 return 1; 72 73 return 0; 74} 75COMMAND(ocb, leave, NULL, NL80211_CMD_LEAVE_OCB, 0, CIB_NETDEV, leave_ocb, 76 "Leave the OCB mode network."); 77