#include <net/if.h> #include <errno.h> #include <string.h> #include "nl80211.h" #include "iw.h" SECTION(ocb); static int join_ocb(struct nl80211_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv, enum id_input id) { unsigned long freq; char *end; int i; static const struct { const char *name; unsigned int width; } *chanmode_selected, chanmode[] = { { .name = "5MHZ", .width = NL80211_CHAN_WIDTH_5 }, { .name = "10MHZ", .width = NL80211_CHAN_WIDTH_10 }, }; if (argc < 2) return 1; /* freq */ freq = strtoul(argv[0], &end, 10); if (*end != '\0') return 1; NLA_PUT_U32(msg, NL80211_ATTR_WIPHY_FREQ, freq); argv++; argc--; /* channel width */ for (i = 0; i < ARRAY_SIZE(chanmode); i++) { if (strcasecmp(chanmode[i].name, argv[0]) == 0) { chanmode_selected = &chanmode[i]; break; } } if (chanmode_selected) { NLA_PUT_U32(msg, NL80211_ATTR_CHANNEL_WIDTH, chanmode_selected->width); NLA_PUT_U32(msg, NL80211_ATTR_CENTER_FREQ1, freq); argv++; argc--; } else { return 1; } return 0; nla_put_failure: return -ENOBUFS; } COMMAND(ocb, join, "<freq in MHz> <5MHZ|10MHZ>", NL80211_CMD_JOIN_OCB, 0, CIB_NETDEV, join_ocb, "Join the OCB mode network."); static int leave_ocb(struct nl80211_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv, enum id_input id) { if (argc) return 1; return 0; } COMMAND(ocb, leave, NULL, NL80211_CMD_LEAVE_OCB, 0, CIB_NETDEV, leave_ocb, "Leave the OCB mode network.");