Added function to delete interface
FossilOrigin-Name: c5c8413343cfc41bc909e74f94bf6886010c4524e213a4927d263c258d94d9ef
This commit is contained in:
parent
b6e4bc5f7b
commit
0f41acb38d
199
src/wtp/wtpdrv.c
199
src/wtp/wtpdrv.c
@ -65,7 +65,7 @@ static struct rd rd;
|
|||||||
|
|
||||||
|
|
||||||
struct wiphydata {
|
struct wiphydata {
|
||||||
|
const char * name;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -292,7 +292,28 @@ static int add_wiphy_data(struct nlattr* msgattribs[NL80211_ATTR_MAX+1])
|
|||||||
printf("Error, on index\n");
|
printf("Error, on index\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
//int index = nla_get_u32( msgattribs[NL80211_ATTR_WIPHY] );
|
|
||||||
|
|
||||||
|
int index = nla_get_u32( msgattribs[NL80211_ATTR_WIPHY] );
|
||||||
|
|
||||||
|
|
||||||
|
struct wiphydata * w = wiphydata[index];
|
||||||
|
|
||||||
|
if (!w) {
|
||||||
|
w = malloc (sizeof(struct wiphydata));
|
||||||
|
memset(w,0,sizeof(struct wiphydata));
|
||||||
|
wiphydata[index]=w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (msgattribs[NL80211_ATTR_WIPHY_NAME] && !w->name){
|
||||||
|
w->name = strdup( nla_get_string(msgattribs[NL80211_ATTR_WIPHY_NAME]));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printf ("Got data for wiphy index %d\n",index);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
|
||||||
if (msgattribs[NL80211_ATTR_WIPHY_BANDS]){
|
if (msgattribs[NL80211_ATTR_WIPHY_BANDS]){
|
||||||
@ -511,9 +532,133 @@ static int xnlCallback(struct nl_msg *msg, void *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int make_if()
|
struct ifindex_cb_data{
|
||||||
|
const char * ifname;
|
||||||
|
int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int get_ifindex_cb(struct nl_msg *msg, void *arg)
|
||||||
{
|
{
|
||||||
const char * ifname = "wtpdrv7";
|
struct ifindex_cb_data * cb_data = (struct ifindex_cb_data *)arg;
|
||||||
|
|
||||||
|
printf("Yeaaaaaaaaaa! The ifindex callback is here\n");
|
||||||
|
struct nlmsghdr *msghdr = nlmsg_hdr(msg);
|
||||||
|
struct nlattr *msgattribs[NL80211_ATTR_MAX + 1];
|
||||||
|
|
||||||
|
struct genlmsghdr *ghdr =
|
||||||
|
(struct genlmsghdr *) nlmsg_data(msghdr);
|
||||||
|
|
||||||
|
int rc;
|
||||||
|
rc = nla_parse(msgattribs, NL80211_ATTR_MAX, genlmsg_attrdata(ghdr, 0),
|
||||||
|
genlmsg_attrlen(ghdr, 0), NULL);
|
||||||
|
|
||||||
|
if (rc<0){
|
||||||
|
cw_dbg(DBG_DRV_ERR,"nla_parse failed: %d %d",rc,nl_geterror(rc));
|
||||||
|
return NL_SKIP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cmd = ghdr->cmd;
|
||||||
|
cw_dbg(DBG_DRV,"NL Callback, cmd=%d - %s",cmd,nlt_get_cmdname(cmd));
|
||||||
|
|
||||||
|
if (cmd == NL80211_CMD_NEW_INTERFACE){
|
||||||
|
if (msgattribs[NL80211_ATTR_IFNAME]){
|
||||||
|
printf ("IFNAME = %s\n",nla_get_string(msgattribs[NL80211_ATTR_IFNAME]));
|
||||||
|
|
||||||
|
cb_data->index = nla_get_u32(msgattribs[NL80211_ATTR_IFINDEX]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int get_ifindex(const char *ifname)
|
||||||
|
{
|
||||||
|
int index = -1;
|
||||||
|
struct nl_msg *msg = nlmsg_alloc();
|
||||||
|
if (!msg)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
int flags = NLM_F_DUMP;
|
||||||
|
|
||||||
|
|
||||||
|
genlmsg_put(msg, 0, NL_AUTO_SEQ, family_id, 0, flags,
|
||||||
|
NL80211_CMD_GET_INTERFACE, 0);
|
||||||
|
|
||||||
|
NLA_PUT_U32(msg, NL80211_ATTR_WIPHY, 0);
|
||||||
|
int rc = nl_send_auto_complete(sk, msg);
|
||||||
|
|
||||||
|
|
||||||
|
printf ("AC C %d\n",rc);
|
||||||
|
|
||||||
|
|
||||||
|
struct ifindex_cb_data cb_data;
|
||||||
|
|
||||||
|
cb_data.ifname=ifname;
|
||||||
|
cb_data.index=-1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct nl_bc * nl_cb = nl_cb_alloc(NL_CB_CUSTOM);
|
||||||
|
nl_cb_set(nl_cb,NL_CB_VALID,NL_CB_CUSTOM, get_ifindex_cb,&cb_data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int nlr = nl_recvmsgs(sk,nl_cb);
|
||||||
|
//int nlr = nl_recvmsgs_default(sk);
|
||||||
|
cw_log(LOG_ERR,"Fatal: Make if %d - %s",nlr,nl_geterror(nlr));
|
||||||
|
|
||||||
|
|
||||||
|
if (cb_data.index!=-1){
|
||||||
|
index=cb_data.index;
|
||||||
|
}
|
||||||
|
|
||||||
|
nla_put_failure:
|
||||||
|
nlmsg_free(msg);
|
||||||
|
return index;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int del_if(const char * name)
|
||||||
|
{
|
||||||
|
int index = get_ifindex(name);
|
||||||
|
if (index==-1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct nl_msg *msg = nlmsg_alloc();
|
||||||
|
if (!msg)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* init message */
|
||||||
|
genlmsg_put(msg, 0, NL_AUTO_SEQ, family_id, 0, 0,
|
||||||
|
NL80211_CMD_DEL_INTERFACE, 0);
|
||||||
|
|
||||||
|
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, index);
|
||||||
|
|
||||||
|
nl_send_auto_complete(sk, msg);
|
||||||
|
|
||||||
|
|
||||||
|
int nlr = nl_recvmsgs_default(sk);
|
||||||
|
printf("Make IF NLR = %d\n", nlr);
|
||||||
|
|
||||||
|
cw_log(LOG_ERR,"Fatal: Del if %d - %s",nlr,nl_geterror(nlr));
|
||||||
|
|
||||||
|
|
||||||
|
// interface_up(ifname);
|
||||||
|
|
||||||
|
|
||||||
|
nla_put_failure:
|
||||||
|
nlmsg_free(msg);
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int make_if(const char * ifname)
|
||||||
|
{
|
||||||
|
// const char * ifname = "wtpdrv7";
|
||||||
|
|
||||||
/* allocate a message */
|
/* allocate a message */
|
||||||
struct nl_msg *msg = nlmsg_alloc();
|
struct nl_msg *msg = nlmsg_alloc();
|
||||||
@ -729,50 +874,49 @@ int init_radios()
|
|||||||
}
|
}
|
||||||
int flags = NLM_F_DUMP;
|
int flags = NLM_F_DUMP;
|
||||||
|
|
||||||
/* setup the message */
|
/* setup message to enumerate wiphy */
|
||||||
genlmsg_put(msg, 0, NL_AUTO_SEQ, family_id, 0, flags,
|
genlmsg_put(msg, 0, NL_AUTO_SEQ, family_id, 0, flags,
|
||||||
NL80211_CMD_GET_WIPHY, 0);
|
NL80211_CMD_GET_WIPHY, 0);
|
||||||
|
|
||||||
int rc = nl_send_auto_complete(sk, msg);
|
int rc = nl_send_auto_complete(sk, msg);
|
||||||
if (rc<0){
|
if (rc<0){
|
||||||
cw_log(LOG_ERR,"Fatal: Can't send nl msg");
|
cw_log(LOG_ERR,"Fatal: Can't send nl msg %d %s",rc,nl_geterror(rc));
|
||||||
return 0;
|
goto nla_put_failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
rc = nl_recvmsgs_default(sk);
|
||||||
|
if (rc){
|
||||||
|
|
||||||
|
cw_log(LOG_ERR,"Error enumerating wiphy: %d %s",rc,nl_geterror(rc));
|
||||||
|
goto nla_put_failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// struct nl_cb bl_cb;
|
nla_put_failure:
|
||||||
|
nlmsg_free(msg);
|
||||||
|
return 1;
|
||||||
rc = nl_recvmsgs_default(sk);
|
|
||||||
printf("IR RC: %d %s\n",rc,nl_geterror(rc));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int gr()
|
int gr()
|
||||||
{
|
{
|
||||||
init_radios();
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
uint8_t buf[64];
|
|
||||||
|
|
||||||
get_ifhwaddr("tabbe",buf);
|
|
||||||
|
|
||||||
|
|
||||||
printf ("HWADDR: %s\n",sock_hwaddr2str(buf,6));
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
|
|
||||||
if (!init())
|
if (!init())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
init_radios();
|
init_radios();
|
||||||
|
|
||||||
|
int index = get_ifindex("wlan0");
|
||||||
|
|
||||||
|
printf("Index is: %d\n",index);
|
||||||
|
|
||||||
|
|
||||||
|
del_if("wlan0");
|
||||||
|
make_if("wlan0");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
make_if();
|
|
||||||
start_ap(sk);
|
start_ap(sk);
|
||||||
sleep(1000);
|
sleep(1000);
|
||||||
|
|
||||||
@ -785,7 +929,6 @@ return 0;
|
|||||||
|
|
||||||
|
|
||||||
printf("Mak If\n");
|
printf("Mak If\n");
|
||||||
make_if();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user