Changeset 12082


Ignore:
Timestamp:
2008-08-03T23:00:34+02:00 (10 years ago)
Author:
nbd
Message:

madwifi: more fixes and cleanups for wds sta separation

Location:
trunk/package/madwifi/patches
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/madwifi/patches/371-wds_sta_separation.patch

    r12052 r12082  
    99        struct ieee80211_key *key; 
    1010        struct ether_header *eh; 
    11 @@ -562,11 +563,14 @@ 
     11@@ -435,7 +436,7 @@ 
     12  
     13        switch (type) { 
     14        case IEEE80211_FC0_TYPE_DATA: 
     15-               hdrspace = ieee80211_hdrspace(ic, wh); 
     16+               hdrspace = ieee80211_hdrsize(wh); 
     17                if (skb->len < hdrspace) { 
     18                        IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, 
     19                                wh, "data", "too short: len %u, expecting %u", 
     20@@ -446,15 +447,20 @@ 
     21                switch (vap->iv_opmode) { 
     22                case IEEE80211_M_STA: 
     23                        if ((dir != IEEE80211_FC1_DIR_FROMDS) && 
     24-                           (!((vap->iv_flags_ext & IEEE80211_FEXT_WDS) && 
     25-                           (dir == IEEE80211_FC1_DIR_DSTODS)))) { 
     26+                           (!(vap->iv_flags_ext & IEEE80211_FEXT_WDS) && 
     27+                            (dir == IEEE80211_FC1_DIR_DSTODS))) { 
     28                                IEEE80211_DISCARD(vap, IEEE80211_MSG_ANY, 
     29                                        wh, "data", "invalid dir 0x%x", dir); 
     30                                vap->iv_stats.is_rx_wrongdir++; 
     31                                goto out; 
     32                        } 
     33  
     34-                       if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { 
     35+                       if (IEEE80211_IS_MULTICAST(wh->i_addr1)) { 
     36+                               /* ignore 3-addr mcast if we're WDS STA */ 
     37+                               if ((vap->iv_flags_ext & IEEE80211_FEXT_WDS) && 
     38+                                       (dir != IEEE80211_FC1_DIR_DSTODS)) 
     39+                                       goto out; 
     40+ 
     41                                /* Discard multicast if IFF_MULTICAST not set */ 
     42                                if ((0 != memcmp(wh->i_addr3, dev->broadcast, ETH_ALEN)) &&  
     43                                        (0 == (dev->flags & IFF_MULTICAST))) { 
     44@@ -482,24 +488,6 @@ 
     45                                        vap->iv_stats.is_rx_mcastecho++; 
     46                                        goto out; 
     47                                } 
     48-                               /*  
     49-                                * if it is brodcasted by me on behalf of 
     50-                                * a station behind me, drop it. 
     51-                                */ 
     52-                               if (vap->iv_flags_ext & IEEE80211_FEXT_WDS) { 
     53-                                       struct ieee80211_node_table *nt; 
     54-                                       struct ieee80211_node *ni_wds; 
     55-                                       nt = &ic->ic_sta; 
     56-                                       ni_wds = ieee80211_find_wds_node(nt, wh->i_addr3); 
     57-                                       if (ni_wds) { 
     58-                                               ieee80211_unref_node(&ni_wds); 
     59-                                               IEEE80211_DISCARD(vap, IEEE80211_MSG_INPUT, 
     60-                                                       wh, NULL, "%s", 
     61-                                                       "multicast echo originated from node behind me"); 
     62-                                               vap->iv_stats.is_rx_mcastecho++; 
     63-                                               goto out; 
     64-                                       } 
     65-                               } 
     66                        } 
     67                        break; 
     68                case IEEE80211_M_IBSS: 
     69@@ -548,7 +536,7 @@ 
     70                         */ 
     71  
     72                        /* check for wds link first */ 
     73-                       if (dir == IEEE80211_FC1_DIR_DSTODS) { 
     74+                       if ((dir == IEEE80211_FC1_DIR_DSTODS) && !ni->ni_subif) { 
     75                                struct ieee80211vap *avp; 
     76  
     77                                TAILQ_FOREACH(avp, &vap->iv_wdslinks, iv_wdsnext) { 
     78@@ -562,11 +550,13 @@ 
    1279                                if (ni_wds != NULL) { 
    1380                                        ieee80211_unref_node(&ni); 
    1481                                        ni = ieee80211_ref_node(ni_wds); 
    15 +                               } else if (!ni->ni_subif && 
    16 +                                               (vap->iv_flags_ext & IEEE80211_FEXT_WDSSEP)) { 
     82+                               } else if (vap->iv_flags_ext & IEEE80211_FEXT_WDSSEP) { 
    1783+                                       ieee80211_wds_addif(ni); 
    1884                                } 
     
    2591                                struct ieee80211_frame_addr4 *wh4; 
    2692  
    27 @@ -698,8 +702,12 @@ 
     93@@ -626,6 +616,11 @@ 
     94                        goto out; 
     95                } 
     96  
     97+               /* check if there is any data left */ 
     98+               hdrspace = ieee80211_hdrspace(ic, wh); 
     99+               if (skb->len < hdrspace) 
     100+                       goto out; 
     101+ 
     102                /* 
     103                 * Handle privacy requirements.  Note that we 
     104                 * must not be preempted from here until after 
     105@@ -698,8 +693,12 @@ 
    28106                if (! accept_data_frame(vap, ni, key, skb, eh)) 
    29107                        goto out; 
     
    40118                IEEE80211_NODE_STAT_ADD(ni, rx_bytes, skb->len); 
    41119                ic->ic_lastdata = jiffies; 
    42 @@ -1132,6 +1140,13 @@ 
     120@@ -1132,6 +1131,13 @@ 
    43121                dev = vap->iv_xrvap->iv_dev; 
    44122 #endif 
     
    54132        /* XXX intra-vap bridging only */ 
    55133        if (vap->iv_opmode == IEEE80211_M_HOSTAP && 
    56 @@ -1157,6 +1172,7 @@ 
     134@@ -1157,6 +1163,7 @@ 
    57135                        if (ni1 != NULL) { 
    58136                                if (ni1->ni_vap == vap && 
     
    74152--- a/net80211/ieee80211_node.h 
    75153+++ b/net80211/ieee80211_node.h 
    76 @@ -92,11 +92,12 @@ 
     154@@ -92,11 +92,13 @@ 
    77155  * the ieee80211com structure. 
    78156  */ 
     
    84162        TAILQ_ENTRY(ieee80211_node) ni_list; 
    85163        LIST_ENTRY(ieee80211_node) ni_hash; 
     164+       struct work_struct ni_create;   /* task for creating a subif */ 
    86165+       struct work_struct ni_destroy;  /* task for destroying a subif */ 
    87166        atomic_t ni_refcnt; 
    88167        u_int ni_scangen;                       /* gen# for timeout scan */ 
    89168        u_int8_t ni_authmode;                   /* authentication algorithm */ 
    90 @@ -430,5 +431,6 @@ 
     169@@ -430,5 +432,6 @@ 
    91170 void ieee80211_node_leave(struct ieee80211_node *); 
    92171 u_int8_t ieee80211_getrssi(struct ieee80211com *); 
     
    204283        if (vap->iv_bss != NULL) { 
    205284                ieee80211_unref_node(&vap->iv_bss); 
    206 @@ -1134,6 +1139,40 @@ 
     285@@ -1134,6 +1139,57 @@ 
    207286        return ni; 
    208287 } 
    209288  
    210289+#define WDSIFNAME ".sta%d" 
    211 +void ieee80211_wds_addif(struct ieee80211_node *ni) 
     290+static void 
     291+ieee80211_wds_do_addif(struct work_struct *work) 
    212292+{ 
     293+       struct ieee80211_node *ni = container_of(work, struct ieee80211_node, ni_create); 
    213294+       struct ieee80211vap *vap = ni->ni_vap; 
    214295+       struct ieee80211com *ic = vap->iv_ic; 
     
    216297+       char *name; 
    217298+ 
    218 +       /* check if the node is split out already */ 
    219 +       if (ni->ni_subif) 
    220 +               return; 
    221 + 
     299+       rtnl_lock(); 
     300+       /* did we get cancelled by the destroy call? */ 
     301+       if (!ni->ni_subif) 
     302+               goto done; 
     303+ 
     304+       ni->ni_subif = NULL; 
    222305+       name = kmalloc(strlen(vap->iv_dev->name) + sizeof(WDSIFNAME) + 1, GFP_KERNEL); 
    223306+       if (!name) 
    224 +               return; 
     307+               goto done; 
    225308+ 
    226309+       strcpy(name, vap->iv_dev->name); 
    227310+       strcat(name, WDSIFNAME); 
    228 +       rtnl_lock(); 
    229311+       avp = ieee80211_create_vap(ic, name, ic->ic_dev, IEEE80211_M_WDS, 0, vap); 
    230312+       kfree(name); 
     
    239321+done: 
    240322+       rtnl_unlock(); 
     323+       ieee80211_unref_node(&ni); 
    241324+} 
    242325+#undef WDSIFNAME 
     326+ 
     327+void ieee80211_wds_addif(struct ieee80211_node *ni) 
     328+{ 
     329+       /* check if the node is split out already, 
     330+        * or if we're in progress of setting up a new interface already */ 
     331+       if (ni->ni_subif) 
     332+               return; 
     333+ 
     334+       ieee80211_ref_node(ni); 
     335+       ni->ni_subif = ni->ni_vap; 
     336+       IEEE80211_INIT_WORK(&ni->ni_create, ieee80211_wds_do_addif); 
     337+       schedule_work(&ni->ni_create); 
     338+} 
    243339+ 
    244340 /* Add wds address to the node table */ 
    245341 int 
    246342 #ifdef IEEE80211_DEBUG_REFCNT 
    247 @@ -2254,6 +2293,28 @@ 
     343@@ -2254,6 +2310,36 @@ 
    248344        } 
    249345 } 
     
    253349+{ 
    254350+       struct ieee80211_node *ni = container_of(work, struct ieee80211_node, ni_destroy); 
    255 +       struct ieee80211vap *vap = ni->ni_subif; 
     351+       struct ieee80211vap *vap; 
    256352+       struct ieee80211com *ic; 
     353+ 
     354+       rtnl_lock(); 
     355+       vap = ni->ni_subif; 
     356+ 
     357+       /* if addif is waiting for the timer to fire, cancel! */ 
     358+       if (vap == ni->ni_vap) { 
     359+               ni->ni_subif = NULL; 
     360+               goto done; 
     361+       } 
    257362+ 
    258363+       if (!vap) 
    259364+               goto done; 
    260365+ 
    261 +       rtnl_lock(); 
    262366+       ic = vap->iv_ic; 
    263367+       ni->ni_subif = NULL; 
     
    265369+       ic->ic_vap_delete(vap); 
    266370+       ic->ic_subifs--; 
    267 +       rtnl_unlock(); 
    268371+ 
    269372+done: 
    270373+       ieee80211_unref_node(&ni); 
     374+       rtnl_unlock(); 
    271375+} 
    272376+ 
     
    274378  * Handle bookkeeping for a station/neighbor leaving 
    275379  * the bss when operating in ap or adhoc modes. 
    276 @@ -2270,6 +2331,12 @@ 
     380@@ -2270,6 +2356,12 @@ 
    277381                        ni, "station with aid %d leaves (refcnt %u)", 
    278382                        IEEE80211_NODE_AID(ni), atomic_read(&ni->ni_refcnt)); 
     
    408512 } 
    409513  
     514@@ -1630,6 +1654,7 @@ 
     515                 */ 
     516                if (ni->ni_authmode != IEEE80211_AUTH_8021X) 
     517                        ieee80211_node_authorize(ni); 
     518+ 
     519 #ifdef ATH_SUPERG_XR 
     520                /* 
     521                 * fire a timer to bring up XR vap if configured. 
     522@@ -1885,8 +1910,15 @@ 
     523                if (ostate == IEEE80211_S_SCAN ||  
     524                    ostate == IEEE80211_S_AUTH || 
     525                    ostate == IEEE80211_S_ASSOC) { 
     526+ 
     527                        /* Transition (S_SCAN|S_AUTH|S_ASSOC) -> S_RUN */ 
     528                        __ieee80211_newstate(vap, nstate, arg); 
     529+ 
     530+                       /* if we're in wds, let the ap know that we're doing this */ 
     531+                       if ((vap->iv_opmode == IEEE80211_M_STA) && 
     532+                               (vap->iv_flags_ext & IEEE80211_FEXT_WDS)) 
     533+                                       ieee80211_send_nulldata(ieee80211_ref_node(vap->iv_bss)); 
     534+ 
     535                        /* Then bring up all other vaps pending on the scan */ 
     536                        dstate = get_dominant_state(ic); 
     537                        if (dstate == IEEE80211_S_RUN) { 
    410538--- a/net80211/ieee80211.c 
    411539+++ b/net80211/ieee80211.c 
    412 @@ -599,8 +599,10 @@ 
     540@@ -373,10 +373,25 @@ 
     541 ieee80211_ifdetach(struct ieee80211com *ic) 
     542 { 
     543        struct ieee80211vap *vap; 
     544+       int count; 
     545+ 
     546+       /* bring down all vaps */ 
     547+       TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { 
     548+               ieee80211_stop(vap->iv_dev); 
     549+       } 
     550+ 
     551+       /* wait for all subifs to disappear */ 
     552+       do { 
     553+               schedule(); 
     554+               rtnl_lock(); 
     555+               count = ic->ic_subifs; 
     556+               rtnl_unlock(); 
     557+       } while (count > 0); 
     558  
     559        rtnl_lock(); 
     560-       while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL) 
     561+       while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL) { 
     562                ic->ic_vap_delete(vap); 
     563+       } 
     564        rtnl_unlock(); 
     565  
     566        del_timer(&ic->ic_dfs_excl_timer); 
     567@@ -599,8 +614,10 @@ 
    413568  
    414569        IEEE80211_CANCEL_TQUEUE(&vap->iv_stajoin1tq); 
     
    455610--- a/net80211/ieee80211_output.c 
    456611+++ b/net80211/ieee80211_output.c 
    457 @@ -786,6 +786,8 @@ 
     612@@ -261,6 +261,10 @@ 
     613                goto bad; 
     614        } 
     615  
     616+       if (ni->ni_subif && (vap != ni->ni_subif) && 
     617+               ((eh)->ether_type != __constant_htons(ETHERTYPE_PAE))) 
     618+               goto bad; 
     619+ 
     620        /* calculate priority so drivers can find the TX queue */ 
     621        if (ieee80211_classify(ni, skb)) { 
     622                IEEE80211_NOTE(vap, IEEE80211_MSG_OUTPUT, ni, 
     623@@ -340,20 +344,33 @@ 
     624  * constructing a frame as it sets i_fc[1]; other bits can 
     625  * then be or'd in. 
     626  */ 
     627-static void 
     628+static struct ieee80211_frame * 
     629 ieee80211_send_setup(struct ieee80211vap *vap, 
     630        struct ieee80211_node *ni, 
     631-       struct ieee80211_frame *wh, 
     632+       struct sk_buff *skb, 
     633        int type, 
     634        const u_int8_t sa[IEEE80211_ADDR_LEN], 
     635        const u_int8_t da[IEEE80211_ADDR_LEN], 
     636        const u_int8_t bssid[IEEE80211_ADDR_LEN]) 
     637 { 
     638 #define        WH4(wh) ((struct ieee80211_frame_addr4 *)wh) 
     639+       struct ieee80211_frame *wh; 
     640+       int len = sizeof(struct ieee80211_frame); 
     641+       int opmode = vap->iv_opmode; 
     642+ 
     643+       if ((type & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) { 
     644+               if ((opmode == IEEE80211_M_STA) && 
     645+                       (vap->iv_flags_ext & IEEE80211_FEXT_WDS)) 
     646+                       opmode = IEEE80211_M_WDS; 
     647+ 
     648+               if (opmode == IEEE80211_M_WDS) 
     649+                       len = sizeof(struct ieee80211_frame_addr4); 
     650+       } 
     651  
     652+       wh = (struct ieee80211_frame *)skb_push(skb, len); 
     653        wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | type; 
     654        if ((type & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) { 
     655-               switch (vap->iv_opmode) { 
     656+               switch (opmode) { 
     657                case IEEE80211_M_STA: 
     658                        wh->i_fc[1] = IEEE80211_FC1_DIR_TODS; 
     659                        IEEE80211_ADDR_COPY(wh->i_addr1, bssid); 
     660@@ -395,6 +412,8 @@ 
     661        *(__le16 *)&wh->i_seq[0] = 
     662            htole16(ni->ni_txseqs[0] << IEEE80211_SEQ_SEQ_SHIFT); 
     663        ni->ni_txseqs[0]++; 
     664+ 
     665+       return wh; 
     666 #undef WH4 
     667 } 
     668  
     669@@ -416,9 +435,7 @@ 
     670  
     671        SKB_CB(skb)->ni = ni; 
     672  
     673-       wh = (struct ieee80211_frame *) 
     674-               skb_push(skb, sizeof(struct ieee80211_frame)); 
     675-       ieee80211_send_setup(vap, ni, wh, 
     676+       wh = ieee80211_send_setup(vap, ni, skb, 
     677                IEEE80211_FC0_TYPE_MGT | type, 
     678                vap->iv_myaddr, ni->ni_macaddr, vap->iv_bssid); 
     679        /* XXX power management */ 
     680@@ -464,6 +481,9 @@ 
     681        struct ieee80211_frame *wh; 
     682        u_int8_t *frm; 
     683  
     684+       if (ni->ni_subif) 
     685+               vap = ni->ni_subif; 
     686+ 
     687        skb = ieee80211_getmgtframe(&frm, 0); 
     688        if (skb == NULL) { 
     689                /* XXX debug msg */ 
     690@@ -472,9 +492,7 @@ 
     691                return -ENOMEM; 
     692        } 
     693  
     694-       wh = (struct ieee80211_frame *) 
     695-               skb_push(skb, sizeof(struct ieee80211_frame)); 
     696-       ieee80211_send_setup(vap, ni, wh, 
     697+       wh = ieee80211_send_setup(vap, ni, skb, 
     698                IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_NODATA, 
     699                vap->iv_myaddr, ni->ni_macaddr, vap->iv_bssid); 
     700        /* NB: power management bit is never sent by an AP */ 
     701@@ -512,6 +530,7 @@ 
     702        struct sk_buff *skb; 
     703        struct ieee80211_qosframe *qwh; 
     704        u_int8_t *frm; 
     705+       u_int8_t *i_qos; 
     706        int tid; 
     707  
     708        skb = ieee80211_getmgtframe(&frm, 2); 
     709@@ -523,11 +542,12 @@ 
     710        SKB_CB(skb)->ni = ieee80211_ref_node(ni); 
     711  
     712        skb->priority = ac; 
     713-       qwh = (struct ieee80211_qosframe *)skb_push(skb, sizeof(struct ieee80211_qosframe)); 
     714  
     715-       qwh = (struct ieee80211_qosframe *)skb->data; 
     716+       /* grab a pointer to QoS control and also compensate for the header length 
     717+        * difference between QoS and non-QoS frame */ 
     718+       i_qos = skb_push(skb, sizeof(struct ieee80211_qosframe) - sizeof(struct ieee80211_frame)); 
     719  
     720-       ieee80211_send_setup(vap, ni, (struct ieee80211_frame *)qwh, 
     721+       qwh = (struct ieee80211_qosframe *) ieee80211_send_setup(vap, ni, skb, 
     722                IEEE80211_FC0_TYPE_DATA, 
     723                vap->iv_myaddr, /* SA */ 
     724                ni->ni_macaddr, /* DA */ 
     725@@ -541,10 +561,10 @@ 
     726  
     727        /* map from access class/queue to 11e header priority value */ 
     728        tid = WME_AC_TO_TID(ac); 
     729-       qwh->i_qos[0] = tid & IEEE80211_QOS_TID; 
     730+       i_qos[0] = tid & IEEE80211_QOS_TID; 
     731        if (ic->ic_wme.wme_wmeChanParams.cap_wmeParams[ac].wmep_noackPolicy) 
     732                qwh->i_qos[0] |= (1 << IEEE80211_QOS_ACKPOLICY_S) & IEEE80211_QOS_ACKPOLICY; 
     733-       qwh->i_qos[1] = 0; 
     734+       i_qos[1] = 0; 
     735  
     736        IEEE80211_NODE_STAT(ni, tx_data); 
     737  
     738@@ -786,6 +806,8 @@ 
    458739                hdrsize = sizeof(struct ieee80211_frame); 
    459740  
     
    464745        switch (vap->iv_opmode) { 
    465746        case IEEE80211_M_IBSS: 
     747@@ -805,20 +827,9 @@ 
     748                        ismulticast = IEEE80211_IS_MULTICAST(eh.ether_dhost); 
     749                break; 
     750        case IEEE80211_M_STA: 
     751-               if ((vap->iv_flags_ext & IEEE80211_FEXT_WDS) && 
     752-                   !IEEE80211_ADDR_EQ(eh.ether_shost, vap->iv_myaddr)) { 
     753+               if (vap->iv_flags_ext & IEEE80211_FEXT_WDS) { 
     754                        use4addr = 1; 
     755-                       ismulticast = IEEE80211_IS_MULTICAST(ni->ni_macaddr); 
     756-                       /* Add a WDS entry to the station VAP */ 
     757-                       if (IEEE80211_IS_MULTICAST(eh.ether_dhost)) { 
     758-                               struct ieee80211_node_table *nt = &ic->ic_sta; 
     759-                               struct ieee80211_node *ni_wds  
     760-                                       = ieee80211_find_wds_node(nt, eh.ether_shost); 
     761-                               if (ni_wds) 
     762-                                       ieee80211_unref_node(&ni_wds); 
     763-                               else 
     764-                                       ieee80211_add_wds_addr(nt, ni, eh.ether_shost, 0); 
     765-                       } 
     766+                       ismulticast = 0; 
     767                } else 
     768                        ismulticast = IEEE80211_IS_MULTICAST(vap->iv_bssid); 
     769                break; 
     770@@ -1689,9 +1700,7 @@ 
     771  
     772        SKB_CB(skb)->ni = ieee80211_ref_node(ni); 
     773  
     774-       wh = (struct ieee80211_frame *) 
     775-               skb_push(skb, sizeof(struct ieee80211_frame)); 
     776-       ieee80211_send_setup(vap, ni, wh, 
     777+       wh = ieee80211_send_setup(vap, ni, skb, 
     778                IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_REQ, 
     779                sa, da, bssid); 
     780        /* XXX power management? */ 
     781--- a/net80211/ieee80211_linux.c 
     782+++ b/net80211/ieee80211_linux.c 
     783@@ -145,7 +145,7 @@ 
     784        struct sk_buff *skb; 
     785        u_int len; 
     786  
     787-       len = roundup(sizeof(struct ieee80211_frame) + pktlen, 4); 
     788+       len = roundup(sizeof(struct ieee80211_frame_addr4) + pktlen, 4); 
     789 #ifdef IEEE80211_DEBUG_REFCNT 
     790        skb = ieee80211_dev_alloc_skb_debug(len + align - 1, func, line); 
     791 #else 
     792@@ -161,7 +161,7 @@ 
     793                SKB_CB(skb)->flags = 0; 
     794                SKB_CB(skb)->next = NULL; 
     795  
     796-               skb_reserve(skb, sizeof(struct ieee80211_frame)); 
     797+               skb_reserve(skb, sizeof(struct ieee80211_frame_addr4)); 
     798                *frm = skb_put(skb, pktlen); 
     799        } 
     800        return skb; 
  • trunk/package/madwifi/patches/372-queue_vif.patch

    r12051 r12082  
    11--- a/net80211/ieee80211_input.c 
    22+++ b/net80211/ieee80211_input.c 
    3 @@ -1183,6 +1183,7 @@ 
     3@@ -1174,6 +1174,7 @@ 
    44                } 
    55                if (skb1 != NULL) { 
     
    99                        skb_reset_mac_header(skb1); 
    1010                        skb_set_network_header(skb1, sizeof(struct ether_header)); 
    11 @@ -1190,7 +1191,12 @@ 
     11@@ -1181,7 +1182,12 @@ 
    1212                        skb1->protocol = __constant_htons(ETH_P_802_2); 
    1313                        /* XXX insert vlan tag before queue it? */ 
     
    2525--- a/net80211/ieee80211_output.c 
    2626+++ b/net80211/ieee80211_output.c 
    27 @@ -329,9 +329,10 @@ 
     27@@ -333,9 +333,10 @@ 
    2828        /* Dispatch the packet to the parent device */ 
    2929        skb->dev = vap->iv_ic->ic_dev; 
Note: See TracChangeset for help on using the changeset viewer.