Ticket #1096: simplify_ni_rxfrag.diff

File simplify_ni_rxfrag.diff, 7.0 kB (added by Mark Glines <mark@glines.org>, 5 years ago)

diff against svn trunk

  • net80211/ieee80211_node.c

    old new  
    757757static void 
    758758node_cleanup(struct ieee80211_node *ni) 
    759759{ 
    760 #define N(a)    (sizeof(a)/sizeof(a[0])) 
    761760        struct ieee80211vap *vap = ni->ni_vap; 
    762         int i; 
    763761 
    764762        /* NB: preserve ni_table */ 
    765763        if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { 
     
    808806         * 
    809807         * XXX does this leave us open to inheriting old state? 
    810808         */ 
    811         for (i = 0; i < N(ni->ni_rxfrag); i++) 
    812                if (ni->ni_rxfrag[i] != NULL) { 
    813                        dev_kfree_skb_any(ni->ni_rxfrag[i]); 
    814                        ni->ni_rxfrag[i] = NULL; 
    815                
     809     
     810        if (ni->ni_rxfrag != NULL) { 
     811                dev_kfree_skb_any(ni->ni_rxfrag); 
     812                ni->ni_rxfrag = NULL; 
     813       
    816814        ieee80211_crypto_delkey(vap, &ni->ni_ucastkey, ni); 
    817815        ni->ni_rxkeyoff = 0; 
    818 #undef N 
    819816} 
    820817 
    821818static void 
     
    857854        struct ieee80211com *ic = nt->nt_ic; 
    858855        struct ieee80211_node *ni; 
    859856        int hash; 
    860         int i; 
    861857 
    862858        ni = ic->ic_node_alloc(nt, vap); 
    863859        if (ni == NULL) { 
     
    890886        ni->ni_table = nt; 
    891887        TAILQ_INSERT_TAIL(&nt->nt_node, ni, ni_list); 
    892888        LIST_INSERT_HEAD(&nt->nt_hash[hash], ni, ni_hash); 
    893 #define N(a)    (sizeof(a)/sizeof(a[0])) 
    894         for (i = 0; i < N(ni->ni_rxfrag); i++) 
    895                 ni->ni_rxfrag[i] = NULL; 
    896 #undef N 
     889        ni->ni_rxfrag = NULL; 
    897890        ni->ni_challenge = NULL; 
    898891        IEEE80211_NODE_UNLOCK_IRQ(nt); 
    899892 
     
    10171010{ 
    10181011        struct ieee80211com *ic = vap->iv_ic; 
    10191012        struct ieee80211_node *ni; 
    1020         int i; 
    10211013 
    10221014        ni = ic->ic_node_alloc(&ic->ic_sta,vap); 
    10231015        if (ni != NULL) { 
     
    10391031 
    10401032                ni->ni_table = NULL;            /* NB: pedantic */ 
    10411033                ni->ni_ic = ic; 
    1042 #define N(a)    (sizeof(a)/sizeof(a[0])) 
    1043                 for (i = 0; i < N(ni->ni_rxfrag); i++) 
    1044                         ni->ni_rxfrag[i] = NULL; 
    1045 #undef N 
     1034                ni->ni_rxfrag = NULL; 
    10461035                ni->ni_challenge = NULL; 
    10471036        } else { 
    10481037                /* XXX msg */ 
     
    10591048{ 
    10601049        struct ieee80211com *ic = vap->iv_ic; 
    10611050        struct ieee80211_node *ni; 
    1062         int i; 
    10631051 
    10641052        ni = ieee80211_alloc_node(&ic->ic_sta, vap, macaddr); 
    10651053        if (ni != NULL) { 
     
    10721060                IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_bss->ni_bssid); 
    10731061                ieee80211_node_set_chan(ic, ni); 
    10741062                ni->ni_rsn = vap->iv_bss->ni_rsn; 
    1075 #define N(a)    (sizeof(a)/sizeof(a[0])) 
    1076                 for (i = 0; i < N(ni->ni_rxfrag); i++) 
    1077                         ni->ni_rxfrag[i] = NULL; 
    1078 #undef N 
     1063                ni->ni_rxfrag = NULL; 
    10791064        } 
    10801065        return ni; 
    10811066} 
     
    15601545                 * (last fragment older than 1s). 
    15611546                 * XXX doesn't belong here 
    15621547                 */ 
    1563                 if (ni->ni_rxfrag[0] != NULL && 
     1548                if (ni->ni_rxfrag != NULL && 
    15641549                    jiffies > ni->ni_rxfragstamp + HZ) { 
    1565                         dev_kfree_skb(ni->ni_rxfrag[0]); 
    1566                         ni->ni_rxfrag[0] = NULL; 
     1550                        dev_kfree_skb(ni->ni_rxfrag); 
     1551                        ni->ni_rxfrag = NULL; 
    15671552                } 
    15681553                /* 
    15691554                 * Special case ourself; we may be idle for extended periods 
  • net80211/ieee80211_node.h

    old new  
    129129        u_int16_t ni_txseqs[17];                        /* tx seq per-tid */ 
    130130        u_int16_t ni_rxseqs[17];                        /* rx seq previous per-tid*/ 
    131131        u_int32_t ni_rxfragstamp;               /* time stamp of last rx frag */ 
    132         struct sk_buff *ni_rxfrag[3];         /* rx frag reassembly */ 
     132        struct sk_buff *ni_rxfrag;            /* rx frag reassembly */ 
    133133        struct ieee80211_rsnparms ni_rsn;       /* RSN/WPA parameters */ 
    134134        struct ieee80211_key ni_ucastkey;       /* unicast key */ 
    135135        int ni_rxkeyoff;                        /* Receive key offset */ 
  • net80211/ieee80211_input.c

    old new  
    962962        fragno = le16_to_cpu(*(__le16 *)wh->i_seq) & IEEE80211_SEQ_FRAG_MASK; 
    963963 
    964964        /* Quick way out, if there's nothing to defragment */ 
    965         if (!more_frag && fragno == 0 && ni->ni_rxfrag[0] == NULL) 
     965        if (!more_frag && fragno == 0 && ni->ni_rxfrag == NULL) 
    966966                return skb; 
    967967 
    968968        /* 
     
    983983        } 
    984984 
    985985        /* 
    986          * Use this lock to make sure ni->ni_rxfrag[0] is 
     986         * Use this lock to make sure ni->ni_rxfrag is 
    987987         * not freed by the timer process while we use it. 
    988988         * XXX bogus 
    989989         */ 
     
    992992        /* 
    993993         * Update the time stamp.  As a side effect, it 
    994994         * also makes sure that the timer will not change 
    995          * ni->ni_rxfrag[0] for at least 1 second, or in 
     995         * ni->ni_rxfrag for at least 1 second, or in 
    996996         * other words, for the remaining of this function. 
    997997         */ 
    998998        ni->ni_rxfragstamp = jiffies; 
     
    10031003         * Validate that fragment is in order and 
    10041004         * related to the previous ones. 
    10051005         */ 
    1006         if (ni->ni_rxfrag[0]) { 
     1006        if (ni->ni_rxfrag) { 
    10071007                struct ieee80211_frame *lwh; 
    10081008 
    1009                 lwh = (struct ieee80211_frame *) ni->ni_rxfrag[0]->data; 
     1009                lwh = (struct ieee80211_frame *) ni->ni_rxfrag->data; 
    10101010                last_rxseq = le16_to_cpu(*(__le16 *)lwh->i_seq) >> 
    10111011                        IEEE80211_SEQ_SEQ_SHIFT; 
    10121012                last_fragno = le16_to_cpu(*(__le16 *)lwh->i_seq) & 
     
    10151015                    || fragno != last_fragno + 1 
    10161016                    || (!IEEE80211_ADDR_EQ(wh->i_addr1, lwh->i_addr1)) 
    10171017                    || (!IEEE80211_ADDR_EQ(wh->i_addr2, lwh->i_addr2)) 
    1018                     || (ni->ni_rxfrag[0]->end - ni->ni_rxfrag[0]->tail < 
     1018                    || (ni->ni_rxfrag->end - ni->ni_rxfrag->tail < 
    10191019                        skb->len)) { 
    10201020                        /* 
    10211021                         * Unrelated fragment or no space for it, 
    10221022                         * clear current fragments 
    10231023                         */ 
    1024                         dev_kfree_skb(ni->ni_rxfrag[0]); 
    1025                         ni->ni_rxfrag[0] = NULL; 
     1024                        dev_kfree_skb(ni->ni_rxfrag); 
     1025                        ni->ni_rxfrag = NULL; 
    10261026                } 
    10271027        } 
    10281028 
    10291029        /* If this is the first fragment */ 
    1030         if (ni->ni_rxfrag[0] == NULL && fragno == 0) { 
    1031                 ni->ni_rxfrag[0] = skb; 
     1030        if (ni->ni_rxfrag == NULL && fragno == 0) { 
     1031                ni->ni_rxfrag = skb; 
    10321032                /* If more frags are coming */ 
    10331033                if (more_frag) { 
    10341034                        if (skb_is_nonlinear(skb)) { 
     
    10361036                                 * We need a continous buffer to 
    10371037                                 * assemble fragments 
    10381038                                 */ 
    1039                                 ni->ni_rxfrag[0] = skb_copy(skb, GFP_ATOMIC); 
     1039                                ni->ni_rxfrag = skb_copy(skb, GFP_ATOMIC); 
    10401040                                dev_kfree_skb(skb); 
    10411041                        } 
    10421042                        /* 
     
    10461046                         */ 
    10471047                        else if (skb->end - skb->head < ni->ni_vap->iv_dev->mtu + 
    10481048                                 hdrlen) { 
    1049                                 ni->ni_rxfrag[0] = skb_copy_expand(skb, 0, 
     1049                                ni->ni_rxfrag = skb_copy_expand(skb, 0, 
    10501050                                        (ni->ni_vap->iv_dev->mtu + hdrlen) - 
    10511051                                        (skb->end - skb->head), GFP_ATOMIC); 
    10521052                                dev_kfree_skb(skb); 
    10531053                        } 
    10541054                } 
    10551055        } else { 
    1056                 if (ni->ni_rxfrag[0]) { 
     1056                if (ni->ni_rxfrag) { 
    10571057                        struct ieee80211_frame *lwh = (struct ieee80211_frame *) 
    1058                                 ni->ni_rxfrag[0]->data; 
     1058                                ni->ni_rxfrag->data; 
    10591059 
    10601060                        /* 
    10611061                         * We know we have enough space to copy, 
    10621062                         * we've verified that before 
    10631063                         */ 
    10641064                        /* Copy current fragment at end of previous one */ 
    1065                         memcpy(ni->ni_rxfrag[0]->tail, 
     1065                        memcpy(ni->ni_rxfrag->tail, 
    10661066                               skb->data + hdrlen, skb->len - hdrlen); 
    10671067                        /* Update tail and length */ 
    1068                         skb_put(ni->ni_rxfrag[0], skb->len - hdrlen); 
     1068                        skb_put(ni->ni_rxfrag, skb->len - hdrlen); 
    10691069                        /* Keep a copy of last sequence and fragno */ 
    10701070                        *(__le16 *) lwh->i_seq = *(__le16 *) wh->i_seq; 
    10711071                } 
     
    10781078                skb = NULL; 
    10791079        } else { 
    10801080                /* Last fragment received, we're done! */ 
    1081                 skb = ni->ni_rxfrag[0]
    1082                 ni->ni_rxfrag[0] = NULL; 
     1081                skb = ni->ni_rxfrag
     1082                ni->ni_rxfrag = NULL; 
    10831083        } 
    10841084        return skb; 
    10851085}