View | Details | Raw Unified | Return to bug 256118
Collapse All | Expand All

(-)b/sys/net80211/ieee80211_adhoc.c (-1 / +1 lines)
Lines 531-537 adhoc_input(struct ieee80211_node *ni, struct mbuf *m, Link Here
531
		 * Next up, any fragmentation.
531
		 * Next up, any fragmentation.
532
		 */
532
		 */
533
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
533
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
534
			m = ieee80211_defrag(ni, m, hdrspace);
534
			m = ieee80211_defrag(ni, m, hdrspace, has_decrypted);
535
			if (m == NULL) {
535
			if (m == NULL) {
536
				/* Fragment dropped or frame not complete yet */
536
				/* Fragment dropped or frame not complete yet */
537
				goto out;
537
				goto out;
(-)b/sys/net80211/ieee80211_hostap.c (-1 / +1 lines)
Lines 719-725 hostap_input(struct ieee80211_node *ni, struct mbuf *m, Link Here
719
		 * Next up, any fragmentation.
719
		 * Next up, any fragmentation.
720
		 */
720
		 */
721
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
721
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
722
			m = ieee80211_defrag(ni, m, hdrspace);
722
			m = ieee80211_defrag(ni, m, hdrspace, has_decrypted);
723
			if (m == NULL) {
723
			if (m == NULL) {
724
				/* Fragment dropped or frame not complete yet */
724
				/* Fragment dropped or frame not complete yet */
725
				goto out;
725
				goto out;
(-)b/sys/net80211/ieee80211_input.c (-3 / +17 lines)
Lines 170-176 ieee80211_input_mimo_all(struct ieee80211com *ic, struct mbuf *m) Link Here
170
 * XXX should handle 3 concurrent reassemblies per-spec.
170
 * XXX should handle 3 concurrent reassemblies per-spec.
171
 */
171
 */
172
struct mbuf *
172
struct mbuf *
173
ieee80211_defrag(struct ieee80211_node *ni, struct mbuf *m, int hdrspace)
173
ieee80211_defrag(struct ieee80211_node *ni, struct mbuf *m, int hdrspace,
174
	int has_decrypted)
174
{
175
{
175
	struct ieee80211vap *vap = ni->ni_vap;
176
	struct ieee80211vap *vap = ni->ni_vap;
176
	struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
177
	struct ieee80211_frame *wh = mtod(m, struct ieee80211_frame *);
Lines 189-194 ieee80211_defrag(struct ieee80211_node *ni, struct mbuf *m, int hdrspace) Link Here
189
	if (!more_frag && fragno == 0 && ni->ni_rxfrag[0] == NULL)
190
	if (!more_frag && fragno == 0 && ni->ni_rxfrag[0] == NULL)
190
		return m;
191
		return m;
191
192
193
	/* Temporarily set flag to remember if fragment was encrypted */
194
	if (has_decrypted)
195
		wh->i_fc[1] |= IEEE80211_FC1_PROTECTED;
196
192
	/*
197
	/*
193
	 * Remove frag to insure it doesn't get reaped by timer.
198
	 * Remove frag to insure it doesn't get reaped by timer.
194
	 */
199
	 */
Lines 219-228 ieee80211_defrag(struct ieee80211_node *ni, struct mbuf *m, int hdrspace) Link Here
219
224
220
		lwh = mtod(mfrag, struct ieee80211_frame *);
225
		lwh = mtod(mfrag, struct ieee80211_frame *);
221
		last_rxseq = le16toh(*(uint16_t *)lwh->i_seq);
226
		last_rxseq = le16toh(*(uint16_t *)lwh->i_seq);
222
		/* NB: check seq # and frag together */
227
		/*
228
		 * NB: check seq # and frag together. Also check that both
229
		 * fragments are plaintext or that both are encrypted.
230
		 * */
223
		if (rxseq == last_rxseq+1 &&
231
		if (rxseq == last_rxseq+1 &&
224
		    IEEE80211_ADDR_EQ(wh->i_addr1, lwh->i_addr1) &&
232
		    IEEE80211_ADDR_EQ(wh->i_addr1, lwh->i_addr1) &&
225
		    IEEE80211_ADDR_EQ(wh->i_addr2, lwh->i_addr2)) {
233
		    IEEE80211_ADDR_EQ(wh->i_addr2, lwh->i_addr2) &&
234
		    !((wh->i_fc[1] ^ lwh->i_fc[1]) & IEEE80211_FC1_PROTECTED)) {
226
			/* XXX clear MORE_FRAG bit? */
235
			/* XXX clear MORE_FRAG bit? */
227
			/* track last seqnum and fragno */
236
			/* track last seqnum and fragno */
228
			*(uint16_t *) lwh->i_seq = *(uint16_t *) wh->i_seq;
237
			*(uint16_t *) lwh->i_seq = *(uint16_t *) wh->i_seq;
Lines 253-258 ieee80211_defrag(struct ieee80211_node *ni, struct mbuf *m, int hdrspace) Link Here
253
		ni->ni_rxfrag[0] = mfrag;
262
		ni->ni_rxfrag[0] = mfrag;
254
		mfrag = NULL;
263
		mfrag = NULL;
255
	}
264
	}
265
	/* Remember to clear protected flag that was temporariy set */
266
	if (mfrag != NULL) {
267
		wh = mtod(mfrag, struct ieee80211_frame *);
268
		wh->i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
269
	}
256
	return mfrag;
270
	return mfrag;
257
}
271
}
258
272
(-)b/sys/net80211/ieee80211_input.h (-1 / +1 lines)
Lines 309-315 ieee80211_check_rxseq(struct ieee80211_node *ni, struct ieee80211_frame *wh, Link Here
309
void	ieee80211_deliver_data(struct ieee80211vap *,
309
void	ieee80211_deliver_data(struct ieee80211vap *,
310
		struct ieee80211_node *, struct mbuf *);
310
		struct ieee80211_node *, struct mbuf *);
311
struct mbuf *ieee80211_defrag(struct ieee80211_node *,
311
struct mbuf *ieee80211_defrag(struct ieee80211_node *,
312
		struct mbuf *, int);
312
		struct mbuf *, int, int);
313
struct mbuf *ieee80211_realign(struct ieee80211vap *, struct mbuf *, size_t);
313
struct mbuf *ieee80211_realign(struct ieee80211vap *, struct mbuf *, size_t);
314
struct mbuf *ieee80211_decap(struct ieee80211vap *, struct mbuf *, int);
314
struct mbuf *ieee80211_decap(struct ieee80211vap *, struct mbuf *, int);
315
struct mbuf *ieee80211_decap1(struct mbuf *, int *);
315
struct mbuf *ieee80211_decap1(struct mbuf *, int *);
(-)b/sys/net80211/ieee80211_mesh.c (-1 / +1 lines)
Lines 1642-1648 mesh_input(struct ieee80211_node *ni, struct mbuf *m, Link Here
1642
		 */
1642
		 */
1643
		hdrspace = ieee80211_hdrspace(ic, wh);
1643
		hdrspace = ieee80211_hdrspace(ic, wh);
1644
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1644
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1645
			m = ieee80211_defrag(ni, m, hdrspace);
1645
			m = ieee80211_defrag(ni, m, hdrspace, 0);
1646
			if (m == NULL) {
1646
			if (m == NULL) {
1647
				/* Fragment dropped or frame not complete yet */
1647
				/* Fragment dropped or frame not complete yet */
1648
				goto out;
1648
				goto out;
(-)b/sys/net80211/ieee80211_sta.c (-1 / +1 lines)
Lines 795-801 sta_input(struct ieee80211_node *ni, struct mbuf *m, Link Here
795
		 * Next up, any fragmentation.
795
		 * Next up, any fragmentation.
796
		 */
796
		 */
797
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
797
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
798
			m = ieee80211_defrag(ni, m, hdrspace);
798
			m = ieee80211_defrag(ni, m, hdrspace, has_decrypted);
799
			if (m == NULL) {
799
			if (m == NULL) {
800
				/* Fragment dropped or frame not complete yet */
800
				/* Fragment dropped or frame not complete yet */
801
				goto out;
801
				goto out;
(-)b/sys/net80211/ieee80211_wds.c (-2 / +1 lines)
Lines 594-600 wds_input(struct ieee80211_node *ni, struct mbuf *m, Link Here
594
		 * Next up, any fragmentation.
594
		 * Next up, any fragmentation.
595
		 */
595
		 */
596
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
596
		if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
597
			m = ieee80211_defrag(ni, m, hdrspace);
597
			m = ieee80211_defrag(ni, m, hdrspace, has_decrypted);
598
			if (m == NULL) {
598
			if (m == NULL) {
599
				/* Fragment dropped or frame not complete yet */
599
				/* Fragment dropped or frame not complete yet */
600
				goto out;
600
				goto out;
601
- 

Return to bug 256118