#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.");