Changeset 37983


Ignore:
Timestamp:
2013-09-14T16:46:51+02:00 (4 years ago)
Author:
nbd
Message:

iwinfo: when using nl80211, parse interface combinations instead of creating/deleting interfaces

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/network/utils/iwinfo/src/iwinfo_nl80211.c

    r36889 r37983  
    22132213} 
    22142214 
     2215static int nl80211_get_ifcomb_cb(struct nl_msg *msg, void *arg) 
     2216{ 
     2217        struct nlattr **attr = nl80211_parse(msg); 
     2218        struct nlattr *comb; 
     2219        int *ret = arg; 
     2220        int comb_rem, limit_rem, mode_rem; 
     2221 
     2222        *ret = 0; 
     2223        if (!attr[NL80211_ATTR_INTERFACE_COMBINATIONS]) 
     2224                return NL_SKIP; 
     2225 
     2226        nla_for_each_nested(comb, attr[NL80211_ATTR_INTERFACE_COMBINATIONS], comb_rem) 
     2227        { 
     2228                static struct nla_policy iface_combination_policy[NUM_NL80211_IFACE_COMB] = { 
     2229                        [NL80211_IFACE_COMB_LIMITS] = { .type = NLA_NESTED }, 
     2230                        [NL80211_IFACE_COMB_MAXNUM] = { .type = NLA_U32 }, 
     2231                }; 
     2232                struct nlattr *tb_comb[NUM_NL80211_IFACE_COMB]; 
     2233                static struct nla_policy iface_limit_policy[NUM_NL80211_IFACE_LIMIT] = { 
     2234                        [NL80211_IFACE_LIMIT_TYPES] = { .type = NLA_NESTED }, 
     2235                        [NL80211_IFACE_LIMIT_MAX] = { .type = NLA_U32 }, 
     2236                }; 
     2237                struct nlattr *tb_limit[NUM_NL80211_IFACE_LIMIT]; 
     2238                struct nlattr *limit; 
     2239 
     2240                nla_parse_nested(tb_comb, NL80211_BAND_ATTR_MAX, comb, iface_combination_policy); 
     2241 
     2242                if (!tb_comb[NL80211_IFACE_COMB_LIMITS]) 
     2243                        continue; 
     2244 
     2245                nla_for_each_nested(limit, tb_comb[NL80211_IFACE_COMB_LIMITS], limit_rem) 
     2246                { 
     2247                        struct nlattr *mode; 
     2248 
     2249                        nla_parse_nested(tb_limit, NUM_NL80211_IFACE_LIMIT, limit, iface_limit_policy); 
     2250 
     2251                        if (!tb_limit[NL80211_IFACE_LIMIT_TYPES] || 
     2252                            !tb_limit[NL80211_IFACE_LIMIT_MAX]) 
     2253                                continue; 
     2254 
     2255                        if (nla_get_u32(tb_limit[NL80211_IFACE_LIMIT_MAX]) < 2) 
     2256                                continue; 
     2257 
     2258                        nla_for_each_nested(mode, tb_limit[NL80211_IFACE_LIMIT_TYPES], mode_rem) { 
     2259                                if (nla_type(mode) == NL80211_IFTYPE_AP) 
     2260                                        *ret = 1; 
     2261                        } 
     2262                } 
     2263        } 
     2264 
     2265        return NL_SKIP; 
     2266} 
     2267 
    22152268int nl80211_get_mbssid_support(const char *ifname, int *buf) 
    22162269{ 
    2217         /* Test whether we can create another interface */ 
    2218         char *nif = nl80211_ifadd(ifname); 
    2219  
    2220         if (nif) 
    2221         { 
    2222                 *buf = (iwinfo_ifmac(nif) && iwinfo_ifup(nif)); 
    2223  
    2224                 iwinfo_ifdown(nif); 
    2225                 nl80211_ifdel(nif); 
    2226  
    2227                 return 0; 
    2228         } 
    2229  
    2230         return -1; 
     2270        struct nl80211_msg_conveyor *req; 
     2271 
     2272        req = nl80211_msg(ifname, NL80211_CMD_GET_WIPHY, 0); 
     2273        if (!req) 
     2274                return -1; 
     2275 
     2276        nl80211_send(req, nl80211_get_ifcomb_cb, buf); 
     2277        nl80211_free(req); 
     2278        return 0; 
    22312279} 
    22322280 
Note: See TracChangeset for help on using the changeset viewer.