Added function to delete interface

FossilOrigin-Name: c5c8413343cfc41bc909e74f94bf6886010c4524e213a4927d263c258d94d9ef
This commit is contained in:
7u83@mail.ru 2014-11-02 13:28:38 +00:00
parent b6e4bc5f7b
commit 0f41acb38d

View File

@ -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();