Ticket #517: iemanagement.diff
| File iemanagement.diff, 21.2 kB (added by pramod@atheros.com, 6 years ago) |
|---|
-
net80211/ieee80211_ioctl.h
old new 471 471 #define IEEE80211_IOC_DELMAC 55 /* del sta from MAC ACL table */ 472 472 #define IEEE80211_IOC_FF 56 /* ATH fast frames (on, off) */ 473 473 #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*/ 474 476 475 477 /* 476 478 * Scan result data returned for IEEE80211_IOC_SCAN_RESULTS. … … 514 516 #define IEEE80211_IOCTL_SETCHANLIST (SIOCIWFIRSTPRIV+6) 515 517 #define IEEE80211_IOCTL_GETCHANLIST (SIOCIWFIRSTPRIV+7) 516 518 #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) 517 522 #define IEEE80211_IOCTL_GETCHANINFO (SIOCIWFIRSTPRIV+13) 518 523 #define IEEE80211_IOCTL_SETOPTIE (SIOCIWFIRSTPRIV+14) 519 524 #define IEEE80211_IOCTL_GETOPTIE (SIOCIWFIRSTPRIV+15) … … 525 530 #define IEEE80211_IOCTL_WDSADDMAC (SIOCIWFIRSTPRIV+26) 526 531 #define IEEE80211_IOCTL_WDSDELMAC (SIOCIWFIRSTPRIV+28) 527 532 #define IEEE80211_IOCTL_KICKMAC (SIOCIWFIRSTPRIV+30) 533 528 534 enum { 529 535 IEEE80211_WMMPARAMS_CWMIN = 1, 530 536 IEEE80211_WMMPARAMS_CWMAX = 2, … … 611 617 #define IEEE80211_NO_STABEACONS 0x0002 /* Do not setup the station beacon timers */ 612 618 }; 613 619 620 /* added APPIEBUF related definations */ 621 enum{ 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 }; 629 struct 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 */ 637 enum { 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 649 struct ieee80211req_set_filter { 650 u_int32_t app_filterype; /* management frame filter type */ 651 }; 652 653 614 654 #endif /* __linux__ */ 615 655 616 656 #endif /* _NET80211_IEEE80211_IOCTL_H_ */ -
net80211/ieee80211_beacon.c
old new 153 153 if (vap->iv_ath_cap & IEEE80211_ATHC_XR) /* XR */ 154 154 frm = ieee80211_add_xr_param(frm, vap); 155 155 #endif 156 bo->bo_appie_buf = frm; 157 bo->bo_appie_buf_len = 0; 158 156 159 bo->bo_tim_trailerlen = frm - bo->bo_tim_trailer; 157 160 bo->bo_chanswitch_trailerlen = frm - bo->bo_chanswitch; 158 161 … … 218 221 + (ic->ic_ath_cap & IEEE80211_ATHC_XR ? /* XR */ 219 222 sizeof(struct ieee80211_xr_param) : 0) 220 223 #endif 224 + IEEE80211_APPIE_MAX /* APP_IE buffer */ 221 225 ; 222 226 skb = ieee80211_getmgtframe(&frm, pktlen); 223 227 if (skb == NULL) { … … 409 413 bo->bo_erp += trailer_adjust; 410 414 bo->bo_ath_caps += trailer_adjust; 411 415 bo->bo_xr += trailer_adjust; 416 bo->bo_appie_buf += trailer_adjust; 412 417 if (timlen > bo->bo_tim_len) 413 418 skb_put(skb, timlen - bo->bo_tim_len); 414 419 else … … 464 469 bo->bo_erp += IEEE80211_CHANSWITCHANN_BYTES; 465 470 bo->bo_ath_caps += IEEE80211_CHANSWITCHANN_BYTES; 466 471 bo->bo_xr += IEEE80211_CHANSWITCHANN_BYTES; 472 bo->bo_appie_buf += IEEE80211_CHANSWITCHANN_BYTES; 467 473 468 474 /* indicate new beacon length so other layers may manage memory */ 469 475 skb_put(skb, IEEE80211_CHANSWITCHANN_BYTES); … … 493 499 IEEE80211_IS_CHAN_TURBO(ic->ic_curchan)) 494 500 ieee80211_add_athAdvCap(bo->bo_ath_caps, vap->iv_bss->ni_ath_flags, 495 501 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 496 527 IEEE80211_BEACON_UNLOCK(ic); 497 528 498 529 return len_changed; -
net80211/ieee80211_wireless.c
old new 2623 2623 return 0; 2624 2624 } 2625 2625 2626 /* the following macros are used by the set/get appiebuf functions */ 2627 static 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 2645 static 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 2655 static 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 2626 2667 static int 2668 ieee80211_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 2734 static int 2735 ieee80211_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 2778 static int 2779 ieee80211_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 2795 static int 2627 2796 ieee80211_ioctl_setkey(struct net_device *dev, struct iw_request_info *info, 2628 2797 void *w, char *extra) 2629 2798 { … … 3607 3776 IW_PRIV_TYPE_BYTE | sizeof(struct ieee80211req_chanlist) 3608 3777 #define IW_PRIV_TYPE_CHANINFO \ 3609 3778 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) 3610 3782 3611 3783 static const struct iw_priv_args ieee80211_priv_args[] = { 3612 3784 /* NB: setoptie & getoptie are !IW_PRIV_SIZE_FIXED */ … … 3929 4101 IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "markdfs" }, 3930 4102 { IEEE80211_PARAM_MARKDFS, 3931 4103 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" }, 3932 4110 3933 4111 #endif /* WIRELESS_EXT >= 12 */ 3934 4112 }; … … 3996 4174 (iw_handler) ieee80211_ioctl_setchanlist, /* SIOCIWFIRSTPRIV+6 */ 3997 4175 (iw_handler) ieee80211_ioctl_getchanlist, /* SIOCIWFIRSTPRIV+7 */ 3998 4176 (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 */ 4001 4179 (iw_handler) ieee80211_ioctl_getscanresults, /* SIOCIWFIRSTPRIV+11 */ 4002 (iw_handler) NULL,/* SIOCIWFIRSTPRIV+12 */4180 (iw_handler) ieee80211_ioctl_setfilter, /* SIOCIWFIRSTPRIV+12 */ 4003 4181 (iw_handler) ieee80211_ioctl_getchaninfo, /* SIOCIWFIRSTPRIV+13 */ 4004 4182 (iw_handler) ieee80211_ioctl_setoptie, /* SIOCIWFIRSTPRIV+14 */ 4005 4183 (iw_handler) ieee80211_ioctl_getoptie, /* SIOCIWFIRSTPRIV+15 */ -
net80211/ieee80211_input.c
old new 2215 2215 time_after(jiffies, ic->ic_lastdata + vap->iv_bgscanidle)); 2216 2216 } 2217 2217 2218 static void 2219 forward_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 2218 2272 void 2219 2273 ieee80211_recv_mgmt(struct ieee80211_node *ni, struct sk_buff *skb, 2220 2274 int subtype, int rssi, u_int32_t rstamp) … … 2233 2287 wh = (struct ieee80211_frame *) skb->data; 2234 2288 frm = (u_int8_t *)&wh[1]; 2235 2289 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 2236 2296 switch (subtype) { 2237 2297 case IEEE80211_FC0_SUBTYPE_PROBE_RESP: 2238 2298 case IEEE80211_FC0_SUBTYPE_BEACON: { -
net80211/ieee80211_output.c
old new 1695 1695 skb = ieee80211_getmgtframe(&frm, 2 + IEEE80211_NWID_LEN + 1696 1696 2 + IEEE80211_RATE_SIZE + 1697 1697 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); 1699 1700 if (skb == NULL) { 1700 1701 vap->iv_stats.is_tx_nobuf++; 1701 1702 ieee80211_free_node(ni); … … 1711 1712 memcpy(frm, optie, optielen); 1712 1713 frm += optielen; 1713 1714 } 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 1714 1722 skb_trim(skb, frm - skb->data); 1715 1723 1716 1724 cb = (struct ieee80211_cb *)skb->cb; … … 1803 1811 + (vap->iv_ath_cap & IEEE80211_ATHC_XR ? /* XR */ 1804 1812 sizeof(struct ieee80211_xr_param) : 0) 1805 1813 #endif 1814 + vap->app_ie[IEEE80211_APPIE_FRAME_ASSOC_RESP].length 1806 1815 ); 1807 1816 if (skb == NULL) 1808 1817 senderr(ENOMEM, is_tx_nobuf); … … 1874 1883 if (vap->iv_ath_cap & IEEE80211_ATHC_XR) /* XR */ 1875 1884 frm = ieee80211_add_xr_param(frm, vap); 1876 1885 #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 1877 1892 skb_trim(skb, frm - skb->data); 1878 1893 break; 1879 1894 … … 1971 1986 4 + 2 + IEEE80211_SUPPCHAN_LEN + 1972 1987 sizeof(struct ieee80211_ie_wme) + 1973 1988 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); 1975 1991 if (skb == NULL) 1976 1992 senderr(ENOMEM, is_tx_nobuf); 1977 1993 … … 2030 2046 memcpy(frm, vap->iv_opt_ie, vap->iv_opt_ie_len); 2031 2047 frm += vap->iv_opt_ie_len; 2032 2048 } 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 2033 2056 skb_trim(skb, frm - skb->data); 2034 2057 2035 2058 timer = IEEE80211_TRANS_WAIT; … … 2052 2075 2 + IEEE80211_RATE_SIZE + 2053 2076 2 + (IEEE80211_RATE_MAXSIZE - IEEE80211_RATE_SIZE) + 2054 2077 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); 2056 2080 if (skb == NULL) 2057 2081 senderr(ENOMEM, is_tx_nobuf); 2058 2082 … … 2087 2111 vap->iv_ath_cap & ni->ni_ath_flags, 2088 2112 ni->ni_ath_defkeyindex); 2089 2113 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 2090 2120 skb_trim(skb, frm - skb->data); 2091 2121 break; 2092 2122 -
net80211/ieee80211_var.h
old new 88 88 #define IEEE80211_TU_TO_MS(x) (((x) * 1024) / 1000) 89 89 #define IEEE80211_TU_TO_JIFFIES(x) ((IEEE80211_TU_TO_MS(x) * HZ) / 1000) 90 90 91 #define IEEE80211_APPIE_MAX 1024 92 91 93 #define IEEE80211_PWRCONSTRAINT_VAL(ic) \ 92 94 (((ic)->ic_bsschan->ic_maxregpower > (ic)->ic_curchanmaxpwr) ? \ 93 95 (ic)->ic_bsschan->ic_maxregpower - (ic)->ic_curchanmaxpwr : 0) … … 264 266 u_int8_t num; 265 267 }; 266 268 269 struct ieee80211_app_ie_t { 270 u_int32_t length; 271 u_int8_t *ie; 272 }; 273 267 274 struct ieee80211vap { 268 275 struct net_device *iv_dev; /* associated device */ 269 276 struct net_device_stats iv_devstats; /* interface statistics */ … … 367 374 unsigned int iv_nsdone; /* Done with scheduled newstate tasklet */ 368 375 uint8_t wds_mac[IEEE80211_ADDR_LEN]; 369 376 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 370 380 }; 371 381 MALLOC_DECLARE(M_80211_VAP); 372 382 … … 424 434 #define IEEE80211_FEXT_REGCLASS 0x00000100 /* CONF: send regclassids in country ie */ 425 435 #define IEEE80211_FEXT_ERPUPDATE 0x00000200 /* STATUS: update ERP element */ 426 436 #define IEEE80211_FEXT_SWBMISS 0x00000400 /* CONF: use software beacon timer */ 437 #define IEEE80211_FEXT_APPIE_UPDATE 0x00000800 /* STATE: beacon APP IE updated */ 427 438 428 439 #define IEEE80211_COM_UAPSD_ENABLE(_ic) ((_ic)->ic_flags_ext |= IEEE80211_FEXT_UAPSD) 429 440 #define IEEE80211_COM_UAPSD_DISABLE(_ic) ((_ic)->ic_flags_ext &= ~IEEE80211_FEXT_UAPSD) -
net80211/ieee80211_proto.h
old new 264 264 u_int8_t *bo_ath_caps; /* where ath caps is */ 265 265 u_int8_t *bo_xr; /* start of xr element */ 266 266 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; 267 269 u_int16_t bo_chanswitch_trailerlen; 268 270 }; 269 271 struct sk_buff *ieee80211_beacon_alloc(struct ieee80211_node *,
