Ticket #1096: simplify_ni_rxfrag.diff
| File simplify_ni_rxfrag.diff, 7.0 kB (added by Mark Glines <mark@glines.org>, 5 years ago) |
|---|
-
net80211/ieee80211_node.c
old new 757 757 static void 758 758 node_cleanup(struct ieee80211_node *ni) 759 759 { 760 #define N(a) (sizeof(a)/sizeof(a[0]))761 760 struct ieee80211vap *vap = ni->ni_vap; 762 int i;763 761 764 762 /* NB: preserve ni_table */ 765 763 if (ni->ni_flags & IEEE80211_NODE_PWR_MGT) { … … 808 806 * 809 807 * XXX does this leave us open to inheriting old state? 810 808 */ 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 } 816 814 ieee80211_crypto_delkey(vap, &ni->ni_ucastkey, ni); 817 815 ni->ni_rxkeyoff = 0; 818 #undef N819 816 } 820 817 821 818 static void … … 857 854 struct ieee80211com *ic = nt->nt_ic; 858 855 struct ieee80211_node *ni; 859 856 int hash; 860 int i;861 857 862 858 ni = ic->ic_node_alloc(nt, vap); 863 859 if (ni == NULL) { … … 890 886 ni->ni_table = nt; 891 887 TAILQ_INSERT_TAIL(&nt->nt_node, ni, ni_list); 892 888 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; 897 890 ni->ni_challenge = NULL; 898 891 IEEE80211_NODE_UNLOCK_IRQ(nt); 899 892 … … 1017 1010 { 1018 1011 struct ieee80211com *ic = vap->iv_ic; 1019 1012 struct ieee80211_node *ni; 1020 int i;1021 1013 1022 1014 ni = ic->ic_node_alloc(&ic->ic_sta,vap); 1023 1015 if (ni != NULL) { … … 1039 1031 1040 1032 ni->ni_table = NULL; /* NB: pedantic */ 1041 1033 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; 1046 1035 ni->ni_challenge = NULL; 1047 1036 } else { 1048 1037 /* XXX msg */ … … 1059 1048 { 1060 1049 struct ieee80211com *ic = vap->iv_ic; 1061 1050 struct ieee80211_node *ni; 1062 int i;1063 1051 1064 1052 ni = ieee80211_alloc_node(&ic->ic_sta, vap, macaddr); 1065 1053 if (ni != NULL) { … … 1072 1060 IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_bss->ni_bssid); 1073 1061 ieee80211_node_set_chan(ic, ni); 1074 1062 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; 1079 1064 } 1080 1065 return ni; 1081 1066 } … … 1560 1545 * (last fragment older than 1s). 1561 1546 * XXX doesn't belong here 1562 1547 */ 1563 if (ni->ni_rxfrag [0]!= NULL &&1548 if (ni->ni_rxfrag != NULL && 1564 1549 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; 1567 1552 } 1568 1553 /* 1569 1554 * 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 962 962 fragno = le16_to_cpu(*(__le16 *)wh->i_seq) & IEEE80211_SEQ_FRAG_MASK; 963 963 964 964 /* 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) 966 966 return skb; 967 967 968 968 /* … … 983 983 } 984 984 985 985 /* 986 * Use this lock to make sure ni->ni_rxfrag [0]is986 * Use this lock to make sure ni->ni_rxfrag is 987 987 * not freed by the timer process while we use it. 988 988 * XXX bogus 989 989 */ … … 992 992 /* 993 993 * Update the time stamp. As a side effect, it 994 994 * also makes sure that the timer will not change 995 * ni->ni_rxfrag [0]for at least 1 second, or in995 * ni->ni_rxfrag for at least 1 second, or in 996 996 * other words, for the remaining of this function. 997 997 */ 998 998 ni->ni_rxfragstamp = jiffies; … … 1003 1003 * Validate that fragment is in order and 1004 1004 * related to the previous ones. 1005 1005 */ 1006 if (ni->ni_rxfrag [0]) {1006 if (ni->ni_rxfrag) { 1007 1007 struct ieee80211_frame *lwh; 1008 1008 1009 lwh = (struct ieee80211_frame *) ni->ni_rxfrag [0]->data;1009 lwh = (struct ieee80211_frame *) ni->ni_rxfrag->data; 1010 1010 last_rxseq = le16_to_cpu(*(__le16 *)lwh->i_seq) >> 1011 1011 IEEE80211_SEQ_SEQ_SHIFT; 1012 1012 last_fragno = le16_to_cpu(*(__le16 *)lwh->i_seq) & … … 1015 1015 || fragno != last_fragno + 1 1016 1016 || (!IEEE80211_ADDR_EQ(wh->i_addr1, lwh->i_addr1)) 1017 1017 || (!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 < 1019 1019 skb->len)) { 1020 1020 /* 1021 1021 * Unrelated fragment or no space for it, 1022 1022 * clear current fragments 1023 1023 */ 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; 1026 1026 } 1027 1027 } 1028 1028 1029 1029 /* 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; 1032 1032 /* If more frags are coming */ 1033 1033 if (more_frag) { 1034 1034 if (skb_is_nonlinear(skb)) { … … 1036 1036 * We need a continous buffer to 1037 1037 * assemble fragments 1038 1038 */ 1039 ni->ni_rxfrag [0]= skb_copy(skb, GFP_ATOMIC);1039 ni->ni_rxfrag = skb_copy(skb, GFP_ATOMIC); 1040 1040 dev_kfree_skb(skb); 1041 1041 } 1042 1042 /* … … 1046 1046 */ 1047 1047 else if (skb->end - skb->head < ni->ni_vap->iv_dev->mtu + 1048 1048 hdrlen) { 1049 ni->ni_rxfrag [0]= skb_copy_expand(skb, 0,1049 ni->ni_rxfrag = skb_copy_expand(skb, 0, 1050 1050 (ni->ni_vap->iv_dev->mtu + hdrlen) - 1051 1051 (skb->end - skb->head), GFP_ATOMIC); 1052 1052 dev_kfree_skb(skb); 1053 1053 } 1054 1054 } 1055 1055 } else { 1056 if (ni->ni_rxfrag [0]) {1056 if (ni->ni_rxfrag) { 1057 1057 struct ieee80211_frame *lwh = (struct ieee80211_frame *) 1058 ni->ni_rxfrag [0]->data;1058 ni->ni_rxfrag->data; 1059 1059 1060 1060 /* 1061 1061 * We know we have enough space to copy, 1062 1062 * we've verified that before 1063 1063 */ 1064 1064 /* Copy current fragment at end of previous one */ 1065 memcpy(ni->ni_rxfrag [0]->tail,1065 memcpy(ni->ni_rxfrag->tail, 1066 1066 skb->data + hdrlen, skb->len - hdrlen); 1067 1067 /* Update tail and length */ 1068 skb_put(ni->ni_rxfrag [0], skb->len - hdrlen);1068 skb_put(ni->ni_rxfrag, skb->len - hdrlen); 1069 1069 /* Keep a copy of last sequence and fragno */ 1070 1070 *(__le16 *) lwh->i_seq = *(__le16 *) wh->i_seq; 1071 1071 } … … 1078 1078 skb = NULL; 1079 1079 } else { 1080 1080 /* 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; 1083 1083 } 1084 1084 return skb; 1085 1085 }
