Ticket #517: iemanagement.diff

File iemanagement.diff, 21.2 kB (added by pramod@atheros.com, 6 years ago)
  • net80211/ieee80211_ioctl.h

    old new  
    471471#define IEEE80211_IOC_DELMAC            55      /* del sta from MAC ACL table */ 
    472472#define IEEE80211_IOC_FF                56      /* ATH fast frames (on, off) */ 
    473473#define IEEE80211_IOC_TURBOP            57      /* ATH turbo' (on, off) */ 
     474#define IEEE80211_IOC_APPIEBUF          58      /* IE in the management frame */ 
     475#define IEEE80211_IOC_FILTERFRAME       59      /* management frame filter*/ 
    474476 
    475477/* 
    476478 * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS. 
     
    514516#define IEEE80211_IOCTL_SETCHANLIST     (SIOCIWFIRSTPRIV+6) 
    515517#define IEEE80211_IOCTL_GETCHANLIST     (SIOCIWFIRSTPRIV+7) 
    516518#define IEEE80211_IOCTL_CHANSWITCH      (SIOCIWFIRSTPRIV+8) 
     519#define IEEE80211_IOCTL_GET_APPIEBUF    (SIOCIWFIRSTPRIV+9) 
     520#define IEEE80211_IOCTL_SET_APPIEBUF    (SIOCIWFIRSTPRIV+10) 
     521#define IEEE80211_IOCTL_FILTERFRAME     (SIOCIWFIRSTPRIV+12) 
    517522#define IEEE80211_IOCTL_GETCHANINFO     (SIOCIWFIRSTPRIV+13) 
    518523#define IEEE80211_IOCTL_SETOPTIE        (SIOCIWFIRSTPRIV+14) 
    519524#define IEEE80211_IOCTL_GETOPTIE        (SIOCIWFIRSTPRIV+15) 
     
    525530#define IEEE80211_IOCTL_WDSADDMAC       (SIOCIWFIRSTPRIV+26) 
    526531#define IEEE80211_IOCTL_WDSDELMAC       (SIOCIWFIRSTPRIV+28) 
    527532#define IEEE80211_IOCTL_KICKMAC         (SIOCIWFIRSTPRIV+30) 
     533 
    528534enum { 
    529535        IEEE80211_WMMPARAMS_CWMIN       = 1, 
    530536        IEEE80211_WMMPARAMS_CWMAX       = 2, 
     
    611617#define IEEE80211_NO_STABEACONS 0x0002          /* Do not setup the station beacon timers */ 
    612618}; 
    613619 
     620/* added APPIEBUF related definations */ 
     621enum{ 
     622    IEEE80211_APPIE_FRAME_BEACON     = 0, 
     623    IEEE80211_APPIE_FRAME_PROBE_REQ  = 1, 
     624    IEEE80211_APPIE_FRAME_PROBE_RESP = 2, 
     625    IEEE80211_APPIE_FRAME_ASSOC_REQ  = 3, 
     626    IEEE80211_APPIE_FRAME_ASSOC_RESP = 4, 
     627    IEEE80211_APPIE_NUM_OF_FRAME     = 5 
     628}; 
     629struct ieee80211req_getset_appiebuf { 
     630    u_int32_t app_frmtype; /*management frame type for which buffer is added*/ 
     631    u_int32_t app_buflen;  /*application supplied buffer length */ 
     632    u_int8_t  app_buf[]; 
     633}; 
     634 
     635/* the following definations are used by application to set filter 
     636 * for receiving management frames */ 
     637enum { 
     638     IEEE80211_FILTER_TYPE_BEACON      =   0x1, 
     639     IEEE80211_FILTER_TYPE_PROBE_REQ   =   0x2, 
     640     IEEE80211_FILTER_TYPE_PROBE_RESP  =   0x4, 
     641     IEEE80211_FILTER_TYPE_ASSOC_REQ   =   0x8, 
     642     IEEE80211_FILTER_TYPE_ASSOC_RESP  =   0x10, 
     643     IEEE80211_FILTER_TYPE_AUTH        =   0x20, 
     644     IEEE80211_FILTER_TYPE_DEAUTH      =   0x40, 
     645     IEEE80211_FILTER_TYPE_DISASSOC    =   0x80, 
     646     IEEE80211_FILTER_TYPE_ALL         =   0xFF  /* used to check the valid filter bits */ 
     647}; 
     648 
     649struct ieee80211req_set_filter { 
     650      u_int32_t app_filterype; /* management frame filter type */ 
     651}; 
     652 
     653 
    614654#endif /* __linux__ */ 
    615655 
    616656#endif /* _NET80211_IEEE80211_IOCTL_H_ */ 
  • net80211/ieee80211_beacon.c

    old new  
    153153        if (vap->iv_ath_cap & IEEE80211_ATHC_XR)        /* XR */ 
    154154                frm = ieee80211_add_xr_param(frm, vap); 
    155155#endif 
     156        bo->bo_appie_buf = frm; 
     157        bo->bo_appie_buf_len = 0; 
     158 
    156159        bo->bo_tim_trailerlen = frm - bo->bo_tim_trailer; 
    157160        bo->bo_chanswitch_trailerlen = frm - bo->bo_chanswitch; 
    158161 
     
    218221                 + (ic->ic_ath_cap & IEEE80211_ATHC_XR ?        /* XR */ 
    219222                        sizeof(struct ieee80211_xr_param) : 0) 
    220223#endif 
     224                 + IEEE80211_APPIE_MAX  /* APP_IE buffer */ 
    221225                 ; 
    222226        skb = ieee80211_getmgtframe(&frm, pktlen); 
    223227        if (skb == NULL) { 
     
    409413                                bo->bo_erp += trailer_adjust; 
    410414                                bo->bo_ath_caps += trailer_adjust; 
    411415                                bo->bo_xr += trailer_adjust; 
     416                                bo->bo_appie_buf += trailer_adjust; 
    412417                                if (timlen > bo->bo_tim_len) 
    413418                                        skb_put(skb, timlen - bo->bo_tim_len); 
    414419                                else 
     
    464469                                bo->bo_erp += IEEE80211_CHANSWITCHANN_BYTES; 
    465470                                bo->bo_ath_caps += IEEE80211_CHANSWITCHANN_BYTES; 
    466471                                bo->bo_xr += IEEE80211_CHANSWITCHANN_BYTES; 
     472                                bo->bo_appie_buf += IEEE80211_CHANSWITCHANN_BYTES; 
    467473 
    468474                                /* indicate new beacon length so other layers may manage memory */ 
    469475                                skb_put(skb, IEEE80211_CHANSWITCHANN_BYTES); 
     
    493499            IEEE80211_IS_CHAN_TURBO(ic->ic_curchan)) 
    494500                ieee80211_add_athAdvCap(bo->bo_ath_caps, vap->iv_bss->ni_ath_flags, 
    495501                        vap->iv_bss->ni_ath_defkeyindex); 
     502        /* add APP_IE buffer if app updated it */ 
     503        if (vap->iv_flags_ext & IEEE80211_FEXT_APPIE_UPDATE) { 
     504        /* adjust the buffer size if the size is changed */ 
     505                if(vap->app_ie[IEEE80211_APPIE_FRAME_BEACON].length != bo-> bo_appie_buf_len) { 
     506                        int diff_len; 
     507                        diff_len = vap->app_ie[IEEE80211_APPIE_FRAME_BEACON].length - bo-> bo_appie_buf_len; 
     508         
     509                        if(diff_len > 0) 
     510                                skb_put(skb,diff_len); 
     511                        else 
     512                                skb_trim(skb,skb->len + diff_len); 
     513 
     514                        bo->bo_appie_buf_len = vap->app_ie[IEEE80211_APPIE_FRAME_BEACON].length; 
     515                        /* update the trailer lens */ 
     516                        bo->bo_chanswitch_trailerlen += diff_len; 
     517                        bo->bo_tim_trailerlen += diff_len; 
     518 
     519                        len_changed = 1; 
     520                } 
     521                memcpy(bo->bo_appie_buf,vap->app_ie[IEEE80211_APPIE_FRAME_BEACON].ie, 
     522                        vap->app_ie[IEEE80211_APPIE_FRAME_BEACON].length); 
     523 
     524                vap->iv_flags_ext &= ~IEEE80211_FEXT_APPIE_UPDATE; 
     525        } 
     526 
    496527        IEEE80211_BEACON_UNLOCK(ic); 
    497528 
    498529        return len_changed; 
  • net80211/ieee80211_wireless.c

    old new  
    26232623        return 0; 
    26242624} 
    26252625 
     2626/* the following macros are used by the set/get appiebuf functions */ 
     2627static int add_app_ie(unsigned int frame_type_index,struct ieee80211vap *vap, 
     2628                      struct ieee80211req_getset_appiebuf *iebuf) 
     2629{ 
     2630     void * ie; 
     2631 
     2632    /* NB: data.length is validated by the wireless extensions code */ 
     2633         MALLOC(ie, void *,iebuf->app_buflen, M_DEVBUF, M_WAITOK); 
     2634         if (ie == NULL) 
     2635          return -ENOMEM; 
     2636         memcpy(ie,iebuf->app_buf,iebuf->app_buflen); 
     2637         if (vap->app_ie[frame_type_index].ie != NULL) 
     2638             FREE(vap->app_ie[frame_type_index].ie, M_DEVBUF); 
     2639         vap->app_ie[frame_type_index].ie = ie; 
     2640             vap->app_ie[frame_type_index].length = iebuf->app_buflen; 
     2641 
     2642     return 0; 
     2643} 
     2644 
     2645static int remove_app_ie(unsigned int frame_type_index,struct ieee80211vap *vap) 
     2646{ 
     2647     if (vap->app_ie[frame_type_index].ie != NULL) { 
     2648         FREE(vap->app_ie[frame_type_index].ie, M_DEVBUF); 
     2649         vap->app_ie[frame_type_index].ie = NULL; 
     2650             vap->app_ie[frame_type_index].length = 0; 
     2651     } 
     2652     return 0; 
     2653} 
     2654 
     2655static int get_app_ie(unsigned int frame_type_index,struct ieee80211vap *vap, 
     2656                      struct ieee80211req_getset_appiebuf *iebuf) 
     2657{ 
     2658     if (iebuf->app_buflen < vap->app_ie[frame_type_index].length) 
     2659         return -EINVAL; 
     2660 
     2661     iebuf->app_buflen = vap->app_ie[frame_type_index].length; 
     2662     memcpy(iebuf->app_buf,vap->app_ie[frame_type_index].ie, 
     2663                               iebuf->app_buflen); 
     2664     return 0; 
     2665} 
     2666 
    26262667static int 
     2668ieee80211_ioctl_setappiebuf(struct net_device *dev, 
     2669                            struct iw_request_info *info, 
     2670                                        void *w, char *extra) 
     2671{ 
     2672        struct ieee80211vap *vap = dev->priv; 
     2673        struct ieee80211req_getset_appiebuf *iebuf =      \ 
     2674                      ( struct ieee80211req_getset_appiebuf *)extra; 
     2675        int rc = 0; 
     2676 
     2677        if (iebuf->app_buflen > IEEE80211_APPIE_MAX) 
     2678             return -EINVAL; 
     2679 
     2680        switch(iebuf->app_frmtype) { 
     2681        case IEEE80211_APPIE_FRAME_BEACON: 
     2682               if (vap->iv_opmode != IEEE80211_M_HOSTAP) 
     2683                  return -EINVAL; 
     2684               if (iebuf->app_buflen) 
     2685                   rc = add_app_ie(IEEE80211_APPIE_FRAME_BEACON,vap,iebuf); 
     2686               else 
     2687                   rc = remove_app_ie(IEEE80211_APPIE_FRAME_BEACON,vap); 
     2688               if (rc==0) { 
     2689                   vap->iv_flags_ext |= IEEE80211_FEXT_APPIE_UPDATE; 
     2690               } else { 
     2691                   return rc; 
     2692               } 
     2693             break; 
     2694        case IEEE80211_APPIE_FRAME_PROBE_REQ: 
     2695               if (vap->iv_opmode != IEEE80211_M_STA) 
     2696                  return -EINVAL; 
     2697               if (iebuf->app_buflen) 
     2698                  rc = add_app_ie(IEEE80211_APPIE_FRAME_PROBE_REQ,vap,iebuf); 
     2699               else 
     2700                  rc = remove_app_ie(IEEE80211_APPIE_FRAME_PROBE_REQ,vap); 
     2701             break; 
     2702        case IEEE80211_APPIE_FRAME_PROBE_RESP: 
     2703               if (vap->iv_opmode != IEEE80211_M_HOSTAP) 
     2704                  return -EINVAL; 
     2705               if (iebuf->app_buflen) 
     2706                  rc = add_app_ie(IEEE80211_APPIE_FRAME_PROBE_RESP,vap,iebuf); 
     2707               else 
     2708                  rc = remove_app_ie(IEEE80211_APPIE_FRAME_PROBE_RESP,vap); 
     2709             break; 
     2710        case IEEE80211_APPIE_FRAME_ASSOC_REQ: 
     2711               if(vap->iv_opmode != IEEE80211_M_STA) 
     2712                  return -EINVAL; 
     2713               if(iebuf->app_buflen) 
     2714                  rc = add_app_ie(IEEE80211_APPIE_FRAME_ASSOC_REQ,vap,iebuf); 
     2715               else 
     2716                  rc = remove_app_ie(IEEE80211_APPIE_FRAME_ASSOC_REQ,vap); 
     2717             break; 
     2718        case IEEE80211_APPIE_FRAME_ASSOC_RESP: 
     2719               if(vap->iv_opmode != IEEE80211_M_HOSTAP) 
     2720                  return -EINVAL; 
     2721               if(iebuf->app_buflen) 
     2722                  rc = add_app_ie(IEEE80211_APPIE_FRAME_ASSOC_RESP,vap,iebuf); 
     2723               else 
     2724                  rc = remove_app_ie(IEEE80211_APPIE_FRAME_ASSOC_RESP,vap); 
     2725             break; 
     2726        default: 
     2727                return -EINVAL; 
     2728 
     2729        } 
     2730 
     2731        return rc; 
     2732} 
     2733 
     2734static int 
     2735ieee80211_ioctl_getappiebuf(struct net_device *dev, struct iw_request_info *info, 
     2736                         void *w, char *extra) 
     2737{ 
     2738        struct ieee80211vap *vap = dev->priv; 
     2739        struct ieee80211req_getset_appiebuf *iebuf = \ 
     2740                              ( struct ieee80211req_getset_appiebuf *)extra; 
     2741 
     2742 
     2743        switch(iebuf->app_frmtype) { 
     2744        case IEEE80211_APPIE_FRAME_BEACON: 
     2745               if(vap->iv_opmode == IEEE80211_M_STA) 
     2746                  return -EINVAL; 
     2747               get_app_ie(IEEE80211_APPIE_FRAME_BEACON,vap,iebuf); 
     2748             break; 
     2749        case IEEE80211_APPIE_FRAME_PROBE_REQ: 
     2750               if(vap->iv_opmode != IEEE80211_M_STA) 
     2751                  return -EINVAL; 
     2752               get_app_ie(IEEE80211_APPIE_FRAME_PROBE_REQ,vap,iebuf); 
     2753             break; 
     2754        case IEEE80211_APPIE_FRAME_PROBE_RESP: 
     2755               if(vap->iv_opmode == IEEE80211_M_STA) 
     2756                  return -EINVAL; 
     2757               get_app_ie(IEEE80211_APPIE_FRAME_PROBE_RESP,vap,iebuf); 
     2758             break; 
     2759        case IEEE80211_APPIE_FRAME_ASSOC_REQ: 
     2760               if(vap->iv_opmode != IEEE80211_M_STA) 
     2761                  return -EINVAL; 
     2762               get_app_ie(IEEE80211_APPIE_FRAME_ASSOC_REQ,vap,iebuf); 
     2763             break; 
     2764        case IEEE80211_APPIE_FRAME_ASSOC_RESP: 
     2765               if(vap->iv_opmode == IEEE80211_M_STA) 
     2766                  return -EINVAL; 
     2767               get_app_ie(IEEE80211_APPIE_FRAME_ASSOC_RESP,vap,iebuf); 
     2768             break; 
     2769        default: 
     2770                return -EINVAL; 
     2771 
     2772        } 
     2773 
     2774       return 0; 
     2775 
     2776} 
     2777 
     2778static int 
     2779ieee80211_ioctl_setfilter(struct net_device *dev, struct iw_request_info *info, 
     2780                         void *w, char *extra) 
     2781{ 
     2782        struct ieee80211vap *vap = dev->priv; 
     2783        struct ieee80211req_set_filter *app_filter = ( struct ieee80211req_set_filter *)extra; 
     2784 
     2785        if ((extra == NULL) || (app_filter->app_filterype & ~IEEE80211_FILTER_TYPE_ALL)) 
     2786           return -EINVAL; 
     2787 
     2788        vap->app_filter =  app_filter->app_filterype; 
     2789        /* printf("driver filter=%x\n", vap->app_filter); */ 
     2790 
     2791        return 0; 
     2792} 
     2793 
     2794 
     2795static int 
    26272796ieee80211_ioctl_setkey(struct net_device *dev, struct iw_request_info *info, 
    26282797        void *w, char *extra) 
    26292798{ 
     
    36073776        IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_chanlist) 
    36083777#define IW_PRIV_TYPE_CHANINFO \ 
    36093778        IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_chaninfo) 
     3779#define IW_PRIV_TYPE_APPIEBUF  (IW_PRIV_TYPE_BYTE | IEEE80211_APPIE_MAX) 
     3780#define IW_PRIV_TYPE_FILTER \ 
     3781        IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_set_filter) 
    36103782 
    36113783static const struct iw_priv_args ieee80211_priv_args[] = { 
    36123784        /* NB: setoptie & getoptie are !IW_PRIV_SIZE_FIXED */ 
     
    39294101          IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "markdfs" }, 
    39304102        { IEEE80211_PARAM_MARKDFS, 
    39314103          0, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_markdfs" }, 
     4104        { IEEE80211_IOCTL_SET_APPIEBUF, 
     4105          IW_PRIV_TYPE_APPIEBUF, 0, "setiebuf" }, 
     4106        { IEEE80211_IOCTL_GET_APPIEBUF, 
     4107          0, IW_PRIV_TYPE_APPIEBUF, "getiebuf" }, 
     4108        { IEEE80211_IOCTL_FILTERFRAME, 
     4109          IW_PRIV_TYPE_FILTER , 0, "setfilter" }, 
    39324110 
    39334111#endif /* WIRELESS_EXT >= 12 */ 
    39344112}; 
     
    39964174        (iw_handler) ieee80211_ioctl_setchanlist,       /* SIOCIWFIRSTPRIV+6 */ 
    39974175        (iw_handler) ieee80211_ioctl_getchanlist,       /* SIOCIWFIRSTPRIV+7 */ 
    39984176        (iw_handler) ieee80211_ioctl_chanswitch,        /* SIOCIWFIRSTPRIV+8 */ 
    3999         (iw_handler) NULL,                            /* SIOCIWFIRSTPRIV+9 */ 
    4000         (iw_handler) NULL,                            /* SIOCIWFIRSTPRIV+10 */ 
     4177        (iw_handler) ieee80211_ioctl_getappiebuf,     /* SIOCIWFIRSTPRIV+9 */ 
     4178        (iw_handler) ieee80211_ioctl_setappiebuf,     /* SIOCIWFIRSTPRIV+10 */ 
    40014179        (iw_handler) ieee80211_ioctl_getscanresults,    /* SIOCIWFIRSTPRIV+11 */ 
    4002         (iw_handler) NULL,                            /* SIOCIWFIRSTPRIV+12 */ 
     4180        (iw_handler) ieee80211_ioctl_setfilter,               /* SIOCIWFIRSTPRIV+12 */ 
    40034181        (iw_handler) ieee80211_ioctl_getchaninfo,       /* SIOCIWFIRSTPRIV+13 */ 
    40044182        (iw_handler) ieee80211_ioctl_setoptie,          /* SIOCIWFIRSTPRIV+14 */ 
    40054183        (iw_handler) ieee80211_ioctl_getoptie,          /* SIOCIWFIRSTPRIV+15 */ 
  • net80211/ieee80211_input.c

    old new  
    22152215                time_after(jiffies, ic->ic_lastdata + vap->iv_bgscanidle)); 
    22162216} 
    22172217 
     2218static void 
     2219forward_mgmt_to_app(struct ieee80211vap *vap, int subtype,struct sk_buff *skb, 
     2220                    struct ieee80211_frame *wh) 
     2221{ 
     2222        struct net_device *dev = vap->iv_dev; 
     2223        int filter_flag =0; 
     2224 
     2225        switch (subtype) { 
     2226                case IEEE80211_FC0_SUBTYPE_BEACON: 
     2227                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_BEACON; 
     2228                        break; 
     2229                case IEEE80211_FC0_SUBTYPE_PROBE_REQ: 
     2230                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_PROBE_REQ; 
     2231                        break; 
     2232                case IEEE80211_FC0_SUBTYPE_PROBE_RESP: 
     2233                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_PROBE_RESP; 
     2234                        break; 
     2235                case IEEE80211_FC0_SUBTYPE_ASSOC_REQ: 
     2236                case IEEE80211_FC0_SUBTYPE_REASSOC_REQ: 
     2237                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_ASSOC_REQ; 
     2238                        break; 
     2239                case IEEE80211_FC0_SUBTYPE_ASSOC_RESP: 
     2240                case IEEE80211_FC0_SUBTYPE_REASSOC_RESP: 
     2241                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_ASSOC_RESP; 
     2242                        break; 
     2243                case IEEE80211_FC0_SUBTYPE_AUTH: 
     2244                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_AUTH; 
     2245                        break; 
     2246                case IEEE80211_FC0_SUBTYPE_DEAUTH: 
     2247                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_DEAUTH; 
     2248                        break; 
     2249                case IEEE80211_FC0_SUBTYPE_DISASSOC: 
     2250                        filter_flag = vap->app_filter & IEEE80211_FILTER_TYPE_DISASSOC; 
     2251                        break; 
     2252                default: 
     2253                        break; 
     2254        } 
     2255 
     2256        if (filter_flag) { 
     2257                struct sk_buff *skb1; 
     2258 
     2259                skb1 = skb_copy(skb, GFP_ATOMIC); 
     2260                if(skb1==NULL) 
     2261                        return; 
     2262                skb1->dev = dev; 
     2263                skb1->mac.raw = skb1->data; 
     2264                skb1->ip_summed = CHECKSUM_NONE; 
     2265                skb1->pkt_type = PACKET_OTHERHOST; 
     2266                skb1->protocol = __constant_htons(0x0019);  /* ETH_P_80211_RAW */ 
     2267         
     2268                netif_rx(skb1); 
     2269        } 
     2270} 
     2271 
    22182272void 
    22192273ieee80211_recv_mgmt(struct ieee80211_node *ni, struct sk_buff *skb, 
    22202274        int subtype, int rssi, u_int32_t rstamp) 
     
    22332287        wh = (struct ieee80211_frame *) skb->data; 
    22342288        frm = (u_int8_t *)&wh[1]; 
    22352289        efrm = skb->data + skb->len; 
     2290 
     2291        /* forward management frame to application */ 
     2292        if (vap->iv_opmode != IEEE80211_M_MONITOR) 
     2293                forward_mgmt_to_app(vap,subtype,skb,wh); 
     2294 
     2295 
    22362296        switch (subtype) { 
    22372297        case IEEE80211_FC0_SUBTYPE_PROBE_RESP: 
    22382298        case IEEE80211_FC0_SUBTYPE_BEACON: { 
  • net80211/ieee80211_output.c

    old new  
    16951695        skb = ieee80211_getmgtframe(&frm, 2 + IEEE80211_NWID_LEN +  
    16961696               2 + IEEE80211_RATE_SIZE +  
    16971697               2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) +  
    1698                (optie != NULL ? optielen : 0)); 
     1698               (optie != NULL ? optielen : 0) 
     1699                + vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length); 
    16991700        if (skb == NULL) { 
    17001701                vap->iv_stats.is_tx_nobuf++; 
    17011702                ieee80211_free_node(ni); 
     
    17111712                memcpy(frm, optie, optielen); 
    17121713                frm += optielen; 
    17131714        } 
     1715 
     1716        if(vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].ie){ 
     1717                memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].ie, 
     1718                        vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length); 
     1719                frm += vap->app_ie[IEEE80211_APPIE_FRAME_PROBE_REQ].length; 
     1720        } 
     1721 
    17141722        skb_trim(skb, frm - skb->data); 
    17151723 
    17161724        cb = (struct ieee80211_cb *)skb->cb; 
     
    18031811                        + (vap->iv_ath_cap & IEEE80211_ATHC_XR ?        /* XR */ 
    18041812                                sizeof(struct ieee80211_xr_param) : 0) 
    18051813#endif 
     1814                        + vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length 
    18061815                ); 
    18071816                if (skb == NULL) 
    18081817                        senderr(ENOMEM, is_tx_nobuf); 
     
    18741883                if (vap->iv_ath_cap & IEEE80211_ATHC_XR)        /* XR */ 
    18751884                        frm = ieee80211_add_xr_param(frm, vap); 
    18761885#endif 
     1886                if(vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie) { 
     1887                        memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie, 
     1888                                vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length); 
     1889                        frm += vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length; 
     1890                } 
     1891 
    18771892                skb_trim(skb, frm - skb->data); 
    18781893                break; 
    18791894 
     
    19711986                        4 + 2 + IEEE80211_SUPPCHAN_LEN + 
    19721987                        sizeof(struct ieee80211_ie_wme) + 
    19731988                        sizeof(struct ieee80211_ie_athAdvCap) + 
    1974                         (vap->iv_opt_ie != NULL ? vap->iv_opt_ie_len : 0)); 
     1989                        (vap->iv_opt_ie != NULL ? vap->iv_opt_ie_len : 0) 
     1990                        + vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length); 
    19751991                if (skb == NULL) 
    19761992                        senderr(ENOMEM, is_tx_nobuf); 
    19771993 
     
    20302046                        memcpy(frm, vap->iv_opt_ie, vap->iv_opt_ie_len); 
    20312047                        frm += vap->iv_opt_ie_len; 
    20322048                } 
     2049 
     2050                if(vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].ie){ 
     2051                        memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].ie, 
     2052                                vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length); 
     2053                        frm += vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_REQ].length; 
     2054                } 
     2055 
    20332056                skb_trim(skb, frm - skb->data); 
    20342057 
    20352058                timer = IEEE80211_TRANS_WAIT; 
     
    20522075                        2 + IEEE80211_RATE_SIZE + 
    20532076                        2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) + 
    20542077                        sizeof(struct ieee80211_wme_param) + 
    2055                         (vap->iv_ath_cap ? sizeof(struct ieee80211_ie_athAdvCap):0)); 
     2078                        (vap->iv_ath_cap ? sizeof(struct ieee80211_ie_athAdvCap):0) 
     2079                        + vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length); 
    20562080                if (skb == NULL) 
    20572081                        senderr(ENOMEM, is_tx_nobuf); 
    20582082 
     
    20872111                                vap->iv_ath_cap & ni->ni_ath_flags, 
    20882112                                ni->ni_ath_defkeyindex);  
    20892113 
     2114                if(vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie){ 
     2115                        memcpy(frm, vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].ie, 
     2116                                vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length); 
     2117                        frm += vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length; 
     2118                } 
     2119 
    20902120                skb_trim(skb, frm - skb->data); 
    20912121                break; 
    20922122 
  • net80211/ieee80211_var.h

    old new  
    8888#define IEEE80211_TU_TO_MS(x)   (((x) * 1024) / 1000) 
    8989#define IEEE80211_TU_TO_JIFFIES(x) ((IEEE80211_TU_TO_MS(x) * HZ) / 1000) 
    9090 
     91#define IEEE80211_APPIE_MAX        1024 
     92 
    9193#define IEEE80211_PWRCONSTRAINT_VAL(ic) \ 
    9294        (((ic)->ic_bsschan->ic_maxregpower > (ic)->ic_curchanmaxpwr) ? \ 
    9395            (ic)->ic_bsschan->ic_maxregpower - (ic)->ic_curchanmaxpwr : 0) 
     
    264266        u_int8_t num; 
    265267}; 
    266268 
     269struct ieee80211_app_ie_t { 
     270    u_int32_t length; 
     271    u_int8_t *ie; 
     272}; 
     273 
    267274struct ieee80211vap { 
    268275        struct net_device *iv_dev;              /* associated device */ 
    269276        struct net_device_stats iv_devstats;    /* interface statistics */ 
     
    367374        unsigned int iv_nsdone;                 /* Done with scheduled newstate tasklet */ 
    368375        uint8_t wds_mac[IEEE80211_ADDR_LEN]; 
    369376        struct ieee80211_spy iv_spy;            /* IWSPY support */ 
     377        struct ieee80211_app_ie_t  app_ie[IEEE80211_APPIE_NUM_OF_FRAME]; 
     378        u_int32_t                  app_filter; 
     379 
    370380}; 
    371381MALLOC_DECLARE(M_80211_VAP); 
    372382 
     
    424434#define IEEE80211_FEXT_REGCLASS 0x00000100      /* CONF: send regclassids in country ie */ 
    425435#define IEEE80211_FEXT_ERPUPDATE 0x00000200     /* STATUS: update ERP element */ 
    426436#define IEEE80211_FEXT_SWBMISS 0x00000400       /* CONF: use software beacon timer */ 
     437#define IEEE80211_FEXT_APPIE_UPDATE 0x00000800  /* STATE: beacon APP IE updated */ 
    427438 
    428439#define IEEE80211_COM_UAPSD_ENABLE(_ic)         ((_ic)->ic_flags_ext |= IEEE80211_FEXT_UAPSD) 
    429440#define IEEE80211_COM_UAPSD_DISABLE(_ic)        ((_ic)->ic_flags_ext &= ~IEEE80211_FEXT_UAPSD) 
  • net80211/ieee80211_proto.h

    old new  
    264264        u_int8_t *bo_ath_caps;          /* where ath caps is */ 
    265265        u_int8_t *bo_xr;                        /* start of xr element */ 
    266266        u_int8_t *bo_erp;               /* start of ERP element */ 
     267        u_int8_t    *bo_appie_buf;  /* start of APP IE buf */ 
     268        u_int16_t   bo_appie_buf_len; 
    267269        u_int16_t bo_chanswitch_trailerlen; 
    268270}; 
    269271struct sk_buff *ieee80211_beacon_alloc(struct ieee80211_node *,