Ticket #1096: simplify_ni_rxfrag_2.diff
| File simplify_ni_rxfrag_2.diff, 7.0 kB (added by Mark Glines <mark@glines.org>, 5 years ago) |
|---|
-
net80211/ieee80211_node.c
old new 759 759 static void 760 760 node_cleanup(struct ieee80211_node *ni) 761 761 { 762 #define N(a) (sizeof(a)/sizeof(a[0]))763 762 struct ieee80211vap *vap = ni->ni_vap; 764 int i;765 763 766 764 /* NB: preserve ni_table */ 767 765 if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { … … 810 808 * 811 809 * XXX does this leave us open to inheriting old state? 812 810 */ 813 for (i = 0; i < N(ni->ni_rxfrag); i++) 814 if (ni->ni_rxfrag[i]!= NULL) {815 dev_kfree_skb_any(ni->ni_rxfrag[i]);816 ni->ni_rxfrag[i]= NULL;817 }811 812 if (ni->ni_rxfrag != NULL) { 813 dev_kfree_skb_any(ni->ni_rxfrag); 814 ni->ni_rxfrag = NULL; 815 } 818 816 ieee80211_crypto_delkey(vap, &ni->ni_ucastkey, ni); 819 817 ni->ni_rxkeyoff = 0; 820 #undef N821 818 } 822 819 823 820 static void … … 859 856 struct ieee80211com *ic = nt->nt_ic; 860 857 struct ieee80211_node *ni; 861 858 int hash; 862 int i;863 859 864 860 ni = ic->ic_node_alloc(nt, vap); 865 861 if (ni == NULL) { … … 892 888 ni->ni_table = nt; 893 889 TAILQ_INSERT_TAIL(&nt->nt_node, ni, ni_list); 894 890 LIST_INSERT_HEAD(&nt->nt_hash[hash], ni, ni_hash); 895 #define N(a) (sizeof(a)/sizeof(a[0])) 896 for (i = 0; i < N(ni->ni_rxfrag); i++) 897 ni->ni_rxfrag[i] = NULL; 898 #undef N 891 ni->ni_rxfrag = NULL; 899 892 ni->ni_challenge = NULL; 900 893 IEEE80211_NODE_UNLOCK_IRQ(nt); 901 894 … … 1019 1012 { 1020 1013 struct ieee80211com *ic = vap->iv_ic; 1021 1014 struct ieee80211_node *ni; 1022 int i;1023 1015 1024 1016 ni = ic->ic_node_alloc(&ic->ic_sta,vap); 1025 1017 if (ni != NULL) { … … 1041 1033 1042 1034 ni->ni_table = NULL; /* NB: pedantic */ 1043 1035 ni->ni_ic = ic; 1044 #define N(a) (sizeof(a)/sizeof(a[0])) 1045 for (i = 0; i < N(ni->ni_rxfrag); i++) 1046 ni->ni_rxfrag[i] = NULL; 1047 #undef N 1036 ni->ni_rxfrag = NULL; 1048 1037 ni->ni_challenge = NULL; 1049 1038 } else { 1050 1039 /* XXX msg */ … … 1061 1050 { 1062 1051 struct ieee80211com *ic = vap->iv_ic; 1063 1052 struct ieee80211_node *ni; 1064 int i;1065 1053 1066 1054 ni = ieee80211_alloc_node(&ic->ic_sta, vap, macaddr); 1067 1055 if (ni != NULL) { … … 1074 1062 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_bss->ni_bssid); 1075 1063 ieee80211_node_set_chan(ic, ni); 1076 1064 ni->ni_rsn = vap->iv_bss->ni_rsn; 1077 #define N(a) (sizeof(a)/sizeof(a[0])) 1078 for (i = 0; i < N(ni->ni_rxfrag); i++) 1079 ni->ni_rxfrag[i] = NULL; 1080 #undef N 1065 ni->ni_rxfrag = NULL; 1081 1066 } 1082 1067 return ni; 1083 1068 } … … 1562 1547 * (last fragment older than 1s). 1563 1548 * XXX doesn't belong here 1564 1549 */ 1565 if (ni->ni_rxfrag [0]!= NULL &&1550 if (ni->ni_rxfrag != NULL && 1566 1551 jiffies > ni->ni_rxfragstamp + HZ) { 1567 dev_kfree_skb(ni->ni_rxfrag [0]);1568 ni->ni_rxfrag [0]= NULL;1552 dev_kfree_skb(ni->ni_rxfrag); 1553 ni->ni_rxfrag = NULL; 1569 1554 } 1570 1555 /* 1571 1556 * Special case ourself; we may be idle for extended periods -
net80211/ieee80211_node.h
old new 129 129 u_int16_t ni_txseqs[17]; /* tx seq per-tid */ 130 130 u_int16_t ni_rxseqs[17]; /* rx seq previous per-tid*/ 131 131 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 */ 133 133 struct ieee80211_rsnparms ni_rsn; /* RSN/WPA parameters */ 134 134 struct ieee80211_key ni_ucastkey; /* unicast key */ 135 135 int ni_rxkeyoff; /* Receive key offset */ -
net80211/ieee80211_input.c
old new 959 959 fragno = le16_to_cpu(*(__le16 *)wh->i_seq) & IEEE80211_SEQ_FRAG_MASK; 960 960 961 961 /* Quick way out, if there's nothing to defragment */ 962 if (!more_frag && fragno == 0 && ni->ni_rxfrag [0]== NULL)962 if (!more_frag && fragno == 0 && ni->ni_rxfrag == NULL) 963 963 return skb; 964 964 965 965 /* … … 980 980 } 981 981 982 982 /* 983 * Use this lock to make sure ni->ni_rxfrag [0]is983 * Use this lock to make sure ni->ni_rxfrag is 984 984 * not freed by the timer process while we use it. 985 985 * XXX bogus 986 986 */ … … 989 989 /* 990 990 * Update the time stamp. As a side effect, it 991 991 * also makes sure that the timer will not change 992 * ni->ni_rxfrag [0]for at least 1 second, or in992 * ni->ni_rxfrag for at least 1 second, or in 993 993 * other words, for the remaining of this function. 994 994 */ 995 995 ni->ni_rxfragstamp = jiffies; … … 1000 1000 * Validate that fragment is in order and 1001 1001 * related to the previous ones. 1002 1002 */ 1003 if (ni->ni_rxfrag [0]) {1003 if (ni->ni_rxfrag) { 1004 1004 struct ieee80211_frame *lwh; 1005 1005 1006 lwh = (struct ieee80211_frame *) ni->ni_rxfrag [0]->data;1006 lwh = (struct ieee80211_frame *) ni->ni_rxfrag->data; 1007 1007 last_rxseq = le16_to_cpu(*(__le16 *)lwh->i_seq) >> 1008 1008 IEEE80211_SEQ_SEQ_SHIFT; 1009 1009 last_fragno = le16_to_cpu(*(__le16 *)lwh->i_seq) & … … 1012 1012 || fragno != last_fragno + 1 1013 1013 || (!IEEE80211_ADDR_EQ(wh->i_addr1, lwh->i_addr1)) 1014 1014 || (!IEEE80211_ADDR_EQ(wh->i_addr2, lwh->i_addr2)) 1015 || (ni->ni_rxfrag [0]->end - ni->ni_rxfrag[0]->tail <1015 || (ni->ni_rxfrag->end - ni->ni_rxfrag->tail < 1016 1016 skb->len)) { 1017 1017 /* 1018 1018 * Unrelated fragment or no space for it, 1019 1019 * clear current fragments 1020 1020 */ 1021 dev_kfree_skb(ni->ni_rxfrag [0]);1022 ni->ni_rxfrag [0]= NULL;1021 dev_kfree_skb(ni->ni_rxfrag); 1022 ni->ni_rxfrag = NULL; 1023 1023 } 1024 1024 } 1025 1025 1026 1026 /* If this is the first fragment */ 1027 if (ni->ni_rxfrag [0]== NULL && fragno == 0) {1028 ni->ni_rxfrag [0]= skb;1027 if (ni->ni_rxfrag == NULL && fragno == 0) { 1028 ni->ni_rxfrag = skb; 1029 1029 /* If more frags are coming */ 1030 1030 if (more_frag) { 1031 1031 if (skb_is_nonlinear(skb)) { … … 1033 1033 * We need a continous buffer to 1034 1034 * assemble fragments 1035 1035 */ 1036 ni->ni_rxfrag [0]= skb_copy(skb, GFP_ATOMIC);1036 ni->ni_rxfrag = skb_copy(skb, GFP_ATOMIC); 1037 1037 dev_kfree_skb(skb); 1038 1038 } 1039 1039 /* … … 1043 1043 */ 1044 1044 else if (skb->end - skb->head < ni->ni_vap->iv_dev->mtu + 1045 1045 hdrlen) { 1046 ni->ni_rxfrag [0]= skb_copy_expand(skb, 0,1046 ni->ni_rxfrag = skb_copy_expand(skb, 0, 1047 1047 (ni->ni_vap->iv_dev->mtu + hdrlen) - 1048 1048 (skb->end - skb->head), GFP_ATOMIC); 1049 1049 dev_kfree_skb(skb); 1050 1050 } 1051 1051 } 1052 1052 } else { 1053 if (ni->ni_rxfrag [0]) {1053 if (ni->ni_rxfrag) { 1054 1054 struct ieee80211_frame *lwh = (struct ieee80211_frame *) 1055 ni->ni_rxfrag [0]->data;1055 ni->ni_rxfrag->data; 1056 1056 1057 1057 /* 1058 1058 * We know we have enough space to copy, 1059 1059 * we've verified that before 1060 1060 */ 1061 1061 /* Copy current fragment at end of previous one */ 1062 memcpy(ni->ni_rxfrag [0]->tail,1062 memcpy(ni->ni_rxfrag->tail, 1063 1063 skb->data + hdrlen, skb->len - hdrlen); 1064 1064 /* Update tail and length */ 1065 skb_put(ni->ni_rxfrag [0], skb->len - hdrlen);1065 skb_put(ni->ni_rxfrag, skb->len - hdrlen); 1066 1066 /* Keep a copy of last sequence and fragno */ 1067 1067 *(__le16 *) lwh->i_seq = *(__le16 *) wh->i_seq; 1068 1068 } … … 1075 1075 skb = NULL; 1076 1076 } else { 1077 1077 /* Last fragment received, we're done! */ 1078 skb = ni->ni_rxfrag [0];1079 ni->ni_rxfrag [0]= NULL;1078 skb = ni->ni_rxfrag; 1079 ni->ni_rxfrag = NULL; 1080 1080 } 1081 1081 return skb; 1082 1082 }
