@@ -962,80 +962,74 @@ ieee80211_rx_h_remove_qos_control(struct ieee80211_txrx_data *rx)
962
962
return TXRX_CONTINUE ;
963
963
}
964
964
965
- static ieee80211_txrx_result
966
- ieee80211_rx_h_802_1x_pae (struct ieee80211_txrx_data * rx )
965
+ static int
966
+ ieee80211_drop_802_1x_pae (struct ieee80211_txrx_data * rx , int hdrlen )
967
967
{
968
- if (rx -> sdata -> eapol && ieee80211_is_eapol (rx -> skb ) &&
968
+ if (rx -> sdata -> eapol && ieee80211_is_eapol (rx -> skb , hdrlen ) &&
969
969
rx -> sdata -> type != IEEE80211_IF_TYPE_STA &&
970
970
(rx -> flags & IEEE80211_TXRXD_RXRA_MATCH ))
971
- return TXRX_CONTINUE ;
971
+ return 0 ;
972
972
973
973
if (unlikely (rx -> sdata -> ieee802_1x &&
974
974
(rx -> fc & IEEE80211_FCTL_FTYPE ) == IEEE80211_FTYPE_DATA &&
975
975
(rx -> fc & IEEE80211_FCTL_STYPE ) != IEEE80211_STYPE_NULLFUNC &&
976
976
(!rx -> sta || !(rx -> sta -> flags & WLAN_STA_AUTHORIZED )) &&
977
- !ieee80211_is_eapol (rx -> skb ))) {
977
+ !ieee80211_is_eapol (rx -> skb , hdrlen ))) {
978
978
#ifdef CONFIG_MAC80211_DEBUG
979
- struct ieee80211_hdr * hdr =
980
- (struct ieee80211_hdr * ) rx -> skb -> data ;
981
- DECLARE_MAC_BUF (mac );
982
- printk (KERN_DEBUG "%s: dropped frame from %s"
983
- " (unauthorized port)\n" , rx -> dev -> name ,
984
- print_mac (mac , hdr -> addr2 ));
979
+ printk (KERN_DEBUG "%s: dropped frame "
980
+ "(unauthorized port)\n" , rx -> dev -> name );
985
981
#endif /* CONFIG_MAC80211_DEBUG */
986
- return TXRX_DROP ;
982
+ return - EACCES ;
987
983
}
988
984
989
- return TXRX_CONTINUE ;
985
+ return 0 ;
990
986
}
991
987
992
- static ieee80211_txrx_result
993
- ieee80211_rx_h_drop_unencrypted (struct ieee80211_txrx_data * rx )
988
+ static int
989
+ ieee80211_drop_unencrypted (struct ieee80211_txrx_data * rx , int hdrlen )
994
990
{
995
991
/*
996
992
* Pass through unencrypted frames if the hardware has
997
993
* decrypted them already.
998
994
*/
999
995
if (rx -> u .rx .status -> flag & RX_FLAG_DECRYPTED )
1000
- return TXRX_CONTINUE ;
996
+ return 0 ;
1001
997
1002
998
/* Drop unencrypted frames if key is set. */
1003
999
if (unlikely (!(rx -> fc & IEEE80211_FCTL_PROTECTED ) &&
1004
1000
(rx -> fc & IEEE80211_FCTL_FTYPE ) == IEEE80211_FTYPE_DATA &&
1005
1001
(rx -> fc & IEEE80211_FCTL_STYPE ) != IEEE80211_STYPE_NULLFUNC &&
1006
1002
(rx -> key || rx -> sdata -> drop_unencrypted ) &&
1007
- (rx -> sdata -> eapol == 0 || !ieee80211_is_eapol (rx -> skb )))) {
1003
+ (rx -> sdata -> eapol == 0 ||
1004
+ !ieee80211_is_eapol (rx -> skb , hdrlen )))) {
1008
1005
if (net_ratelimit ())
1009
1006
printk (KERN_DEBUG "%s: RX non-WEP frame, but expected "
1010
1007
"encryption\n" , rx -> dev -> name );
1011
- return TXRX_DROP ;
1008
+ return - EACCES ;
1012
1009
}
1013
- return TXRX_CONTINUE ;
1010
+ return 0 ;
1014
1011
}
1015
1012
1016
- static ieee80211_txrx_result
1017
- ieee80211_rx_h_data (struct ieee80211_txrx_data * rx )
1013
+ static int
1014
+ ieee80211_data_to_8023 (struct ieee80211_txrx_data * rx )
1018
1015
{
1019
1016
struct net_device * dev = rx -> dev ;
1020
- struct ieee80211_local * local = rx -> local ;
1021
1017
struct ieee80211_hdr * hdr = (struct ieee80211_hdr * ) rx -> skb -> data ;
1022
1018
u16 fc , hdrlen , ethertype ;
1023
1019
u8 * payload ;
1024
1020
u8 dst [ETH_ALEN ];
1025
1021
u8 src [ETH_ALEN ];
1026
- struct sk_buff * skb = rx -> skb , * skb2 ;
1022
+ struct sk_buff * skb = rx -> skb ;
1027
1023
struct ieee80211_sub_if_data * sdata = IEEE80211_DEV_TO_SUB_IF (dev );
1028
1024
DECLARE_MAC_BUF (mac );
1029
1025
DECLARE_MAC_BUF (mac2 );
1030
1026
DECLARE_MAC_BUF (mac3 );
1031
1027
DECLARE_MAC_BUF (mac4 );
1032
1028
1033
1029
fc = rx -> fc ;
1034
- if (unlikely ((fc & IEEE80211_FCTL_FTYPE ) != IEEE80211_FTYPE_DATA ))
1035
- return TXRX_CONTINUE ;
1036
1030
1037
1031
if (unlikely (!WLAN_FC_DATA_PRESENT (fc )))
1038
- return TXRX_DROP ;
1032
+ return -1 ;
1039
1033
1040
1034
hdrlen = ieee80211_get_hdrlen (fc );
1041
1035
@@ -1064,7 +1058,7 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1064
1058
print_mac (mac , hdr -> addr1 ),
1065
1059
print_mac (mac2 , hdr -> addr2 ),
1066
1060
print_mac (mac3 , hdr -> addr3 ));
1067
- return TXRX_DROP ;
1061
+ return -1 ;
1068
1062
}
1069
1063
break ;
1070
1064
case (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS ):
@@ -1081,7 +1075,7 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1081
1075
print_mac (mac2 , hdr -> addr2 ),
1082
1076
print_mac (mac3 , hdr -> addr3 ),
1083
1077
print_mac (mac4 , hdr -> addr4 ));
1084
- return TXRX_DROP ;
1078
+ return -1 ;
1085
1079
}
1086
1080
break ;
1087
1081
case IEEE80211_FCTL_FROMDS :
@@ -1092,7 +1086,7 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1092
1086
if (sdata -> type != IEEE80211_IF_TYPE_STA ||
1093
1087
(is_multicast_ether_addr (dst ) &&
1094
1088
!compare_ether_addr (src , dev -> dev_addr )))
1095
- return TXRX_DROP ;
1089
+ return -1 ;
1096
1090
break ;
1097
1091
case 0 :
1098
1092
/* DA SA BSSID */
@@ -1108,21 +1102,20 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1108
1102
print_mac (mac2 , hdr -> addr2 ),
1109
1103
print_mac (mac3 , hdr -> addr3 ));
1110
1104
}
1111
- return TXRX_DROP ;
1105
+ return -1 ;
1112
1106
}
1113
1107
break ;
1114
1108
}
1115
1109
1116
- payload = skb -> data + hdrlen ;
1117
-
1118
1110
if (unlikely (skb -> len - hdrlen < 8 )) {
1119
1111
if (net_ratelimit ()) {
1120
1112
printk (KERN_DEBUG "%s: RX too short data frame "
1121
1113
"payload\n" , dev -> name );
1122
1114
}
1123
- return TXRX_DROP ;
1115
+ return -1 ;
1124
1116
}
1125
1117
1118
+ payload = skb -> data + hdrlen ;
1126
1119
ethertype = (payload [6 ] << 8 ) | payload [7 ];
1127
1120
1128
1121
if (likely ((compare_ether_addr (payload , rfc1042_header ) == 0 &&
@@ -1143,21 +1136,28 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1143
1136
memcpy (ehdr -> h_source , src , ETH_ALEN );
1144
1137
ehdr -> h_proto = len ;
1145
1138
}
1146
- skb -> dev = dev ;
1139
+ return 0 ;
1140
+ }
1147
1141
1148
- skb2 = NULL ;
1142
+ static void
1143
+ ieee80211_deliver_skb (struct ieee80211_txrx_data * rx )
1144
+ {
1145
+ struct net_device * dev = rx -> dev ;
1146
+ struct ieee80211_local * local = rx -> local ;
1147
+ struct sk_buff * skb , * xmit_skb ;
1148
+ struct ieee80211_sub_if_data * sdata = IEEE80211_DEV_TO_SUB_IF (dev );
1149
1149
1150
- dev -> stats . rx_packets ++ ;
1151
- dev -> stats . rx_bytes += skb -> len ;
1150
+ skb = rx -> skb ;
1151
+ xmit_skb = NULL ;
1152
1152
1153
1153
if (local -> bridge_packets && (sdata -> type == IEEE80211_IF_TYPE_AP
1154
1154
|| sdata -> type == IEEE80211_IF_TYPE_VLAN ) &&
1155
1155
(rx -> flags & IEEE80211_TXRXD_RXRA_MATCH )) {
1156
1156
if (is_multicast_ether_addr (skb -> data )) {
1157
1157
/* send multicast frames both to higher layers in
1158
1158
* local net stack and back to the wireless media */
1159
- skb2 = skb_copy (skb , GFP_ATOMIC );
1160
- if (!skb2 && net_ratelimit ())
1159
+ xmit_skb = skb_copy (skb , GFP_ATOMIC );
1160
+ if (!xmit_skb && net_ratelimit ())
1161
1161
printk (KERN_DEBUG "%s: failed to clone "
1162
1162
"multicast frame\n" , dev -> name );
1163
1163
} else {
@@ -1172,7 +1172,7 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1172
1172
* AP, so send the frame directly to it and
1173
1173
* do not pass the frame to local net stack.
1174
1174
*/
1175
- skb2 = skb ;
1175
+ xmit_skb = skb ;
1176
1176
skb = NULL ;
1177
1177
}
1178
1178
if (dsta )
@@ -1187,13 +1187,45 @@ ieee80211_rx_h_data(struct ieee80211_txrx_data *rx)
1187
1187
netif_rx (skb );
1188
1188
}
1189
1189
1190
- if (skb2 ) {
1190
+ if (xmit_skb ) {
1191
1191
/* send to wireless media */
1192
- skb2 -> protocol = __constant_htons (ETH_P_802_3 );
1193
- skb_set_network_header (skb2 , 0 );
1194
- skb_set_mac_header (skb2 , 0 );
1195
- dev_queue_xmit (skb2 );
1192
+ xmit_skb -> protocol = __constant_htons (ETH_P_802_3 );
1193
+ skb_set_network_header (xmit_skb , 0 );
1194
+ skb_set_mac_header (xmit_skb , 0 );
1195
+ dev_queue_xmit (xmit_skb );
1196
1196
}
1197
+ }
1198
+
1199
+ static ieee80211_txrx_result
1200
+ ieee80211_rx_h_data (struct ieee80211_txrx_data * rx )
1201
+ {
1202
+ struct net_device * dev = rx -> dev ;
1203
+ u16 fc ;
1204
+ int err , hdrlen ;
1205
+
1206
+ fc = rx -> fc ;
1207
+ if (unlikely ((fc & IEEE80211_FCTL_FTYPE ) != IEEE80211_FTYPE_DATA ))
1208
+ return TXRX_CONTINUE ;
1209
+
1210
+ if (unlikely (!WLAN_FC_DATA_PRESENT (fc )))
1211
+ return TXRX_DROP ;
1212
+
1213
+ hdrlen = ieee80211_get_hdrlen (fc );
1214
+
1215
+ if ((ieee80211_drop_802_1x_pae (rx , hdrlen )) ||
1216
+ (ieee80211_drop_unencrypted (rx , hdrlen )))
1217
+ return TXRX_DROP ;
1218
+
1219
+ err = ieee80211_data_to_8023 (rx );
1220
+ if (unlikely (err ))
1221
+ return TXRX_DROP ;
1222
+
1223
+ rx -> skb -> dev = dev ;
1224
+
1225
+ dev -> stats .rx_packets ++ ;
1226
+ dev -> stats .rx_bytes += rx -> skb -> len ;
1227
+
1228
+ ieee80211_deliver_skb (rx );
1197
1229
1198
1230
return TXRX_QUEUED ;
1199
1231
}
@@ -1347,8 +1379,6 @@ ieee80211_rx_handler ieee80211_rx_handlers[] =
1347
1379
* are not passed to user space by these functions
1348
1380
*/
1349
1381
ieee80211_rx_h_remove_qos_control ,
1350
- ieee80211_rx_h_802_1x_pae ,
1351
- ieee80211_rx_h_drop_unencrypted ,
1352
1382
ieee80211_rx_h_data ,
1353
1383
ieee80211_rx_h_mgmt ,
1354
1384
NULL
0 commit comments