Changeset 37984


Ignore:
Timestamp:
2013-09-14T16:47:26+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@…>

Backport of r37983

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/attitude_adjustment/package/iwinfo/src/iwinfo_nl80211.c

    r36465 r37984  
    21562156} 
    21572157 
     2158static int nl80211_get_ifcomb_cb(struct nl_msg *msg, void *arg) 
     2159{ 
     2160        struct nlattr **attr = nl80211_parse(msg); 
     2161        struct nlattr *comb; 
     2162        int *ret = arg; 
     2163        int comb_rem, limit_rem, mode_rem; 
     2164 
     2165        *ret = 0; 
     2166        if (!attr[NL80211_ATTR_INTERFACE_COMBINATIONS]) 
     2167                return NL_SKIP; 
     2168 
     2169        nla_for_each_nested(comb, attr[NL80211_ATTR_INTERFACE_COMBINATIONS], comb_rem) 
     2170        { 
     2171                static struct nla_policy iface_combination_policy[NUM_NL80211_IFACE_COMB] = { 
     2172                        [NL80211_IFACE_COMB_LIMITS] = { .type = NLA_NESTED }, 
     2173                        [NL80211_IFACE_COMB_MAXNUM] = { .type = NLA_U32 }, 
     2174                }; 
     2175                struct nlattr *tb_comb[NUM_NL80211_IFACE_COMB]; 
     2176                static struct nla_policy iface_limit_policy[NUM_NL80211_IFACE_LIMIT] = { 
     2177                        [NL80211_IFACE_LIMIT_TYPES] = { .type = NLA_NESTED }, 
     2178                        [NL80211_IFACE_LIMIT_MAX] = { .type = NLA_U32 }, 
     2179                }; 
     2180                struct nlattr *tb_limit[NUM_NL80211_IFACE_LIMIT]; 
     2181                struct nlattr *limit; 
     2182 
     2183                nla_parse_nested(tb_comb, NL80211_BAND_ATTR_MAX, comb, iface_combination_policy); 
     2184 
     2185                if (!tb_comb[NL80211_IFACE_COMB_LIMITS]) 
     2186                        continue; 
     2187 
     2188                nla_for_each_nested(limit, tb_comb[NL80211_IFACE_COMB_LIMITS], limit_rem) 
     2189                { 
     2190                        struct nlattr *mode; 
     2191 
     2192                        nla_parse_nested(tb_limit, NUM_NL80211_IFACE_LIMIT, limit, iface_limit_policy); 
     2193 
     2194                        if (!tb_limit[NL80211_IFACE_LIMIT_TYPES] || 
     2195                            !tb_limit[NL80211_IFACE_LIMIT_MAX]) 
     2196                                continue; 
     2197 
     2198                        if (nla_get_u32(tb_limit[NL80211_IFACE_LIMIT_MAX]) < 2) 
     2199                                continue; 
     2200 
     2201                        nla_for_each_nested(mode, tb_limit[NL80211_IFACE_LIMIT_TYPES], mode_rem) { 
     2202                                if (nla_type(mode) == NL80211_IFTYPE_AP) 
     2203                                        *ret = 1; 
     2204                        } 
     2205                } 
     2206        } 
     2207 
     2208        return NL_SKIP; 
     2209} 
     2210 
    21582211int nl80211_get_mbssid_support(const char *ifname, int *buf) 
    21592212{ 
    2160         /* Test whether we can create another interface */ 
    2161         char *nif = nl80211_ifadd(ifname); 
    2162  
    2163         if (nif) 
    2164         { 
    2165                 *buf = (iwinfo_ifmac(nif) && iwinfo_ifup(nif)); 
    2166  
    2167                 iwinfo_ifdown(nif); 
    2168                 nl80211_ifdel(nif); 
    2169  
    2170                 return 0; 
    2171         } 
    2172  
    2173         return -1; 
     2213        struct nl80211_msg_conveyor *req; 
     2214 
     2215        req = nl80211_msg(ifname, NL80211_CMD_GET_WIPHY, 0); 
     2216        if (!req) 
     2217                return -1; 
     2218 
     2219        nl80211_send(req, nl80211_get_ifcomb_cb, buf); 
     2220        nl80211_free(req); 
     2221        return 0; 
    21742222} 
    21752223 
Note: See TracChangeset for help on using the changeset viewer.