+static char * madwifi_ifadd(const char *ifname)
+{
+ char *wifidev = NULL;
+ struct ifreq ifr = { 0 };
+ struct ieee80211_clone_params cp = { 0 };
+ static char nif[IFNAMSIZ] = { 0 };
+
+ if( !(wifidev = madwifi_isvap(ifname, NULL)) && madwifi_iswifi(ifname) )
+ wifidev = (char *)ifname;
+
+ if( wifidev )
+ {
+ snprintf(nif, sizeof(nif), "tmp.%s", ifname);
+
+ strncpy(cp.icp_name, nif, IFNAMSIZ);
+ cp.icp_opmode = IEEE80211_M_MONITOR;
+ cp.icp_flags = IEEE80211_CLONE_BSSID;
+
+ strncpy(ifr.ifr_name, wifidev, IFNAMSIZ);
+ ifr.ifr_data = (void *)&cp;
+
+ if( !madwifi_ioctl(SIOC80211IFCREATE, &ifr) )
+ return nif;
+ }
+
+ return NULL;
+}
+
+static void madwifi_ifdel(const char *ifname)
+{
+ struct ifreq ifr = { 0 };
+
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+ madwifi_ioctl(SIOC80211IFDESTROY, &ifr);
+}
+
+static int madwifi_ifup(const char *ifname)
+{
+ struct ifreq ifr;
+
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
+ return 0;
+
+ ifr.ifr_flags |= (IFF_UP | IFF_RUNNING);
+
+ return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
+}
+
+static int madwifi_ifdown(const char *ifname)
+{
+ struct ifreq ifr;
+
+ strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
+
+ if( madwifi_ioctl(SIOCGIFFLAGS, &ifr) )
+ return 0;
+
+ ifr.ifr_flags &= ~(IFF_UP | IFF_RUNNING);
+
+ return !madwifi_ioctl(SIOCSIFFLAGS, &ifr);
+}
+