@ -461,21 +461,17 @@ static struct nai_realm_eap * nai_realm_find_eap(struct wpa_cred *cred,
# ifdef INTERWORKING_3GPP
static int plmn_id_match ( struct wpabuf * anqp , const char * imsi )
static int plmn_id_match ( struct wpabuf * anqp , const char * imsi , int mnc_len )
{
const char * sep ;
u8 plmn [ 3 ] ;
const u8 * pos , * end ;
u8 udhl ;
sep = os_strchr ( imsi , ' - ' ) ;
if ( sep = = NULL | | ( sep - imsi ! = 5 & & sep - imsi ! = 6 ) )
return 0 ;
/* See Annex A of 3GPP TS 24.234 v8.1.0 for description */
plmn [ 0 ] = ( imsi [ 0 ] - ' 0 ' ) | ( ( imsi [ 1 ] - ' 0 ' ) < < 4 ) ;
plmn [ 1 ] = imsi [ 2 ] - ' 0 ' ;
if ( sep - imsi = = 6 )
/* default to MNC length 3 if unknown */
if ( mnc_len ! = 2 )
plmn [ 1 ] | = ( imsi [ 5 ] - ' 0 ' ) < < 4 ;
else
plmn [ 1 ] | = 0xf0 ;
@ -602,10 +598,19 @@ static int interworking_connect_3gpp(struct wpa_supplicant *wpa_s,
return - 1 ;
for ( cred = wpa_s - > conf - > cred ; cred ; cred = cred - > next ) {
char * sep ;
if ( cred - > imsi = = NULL | | ! cred - > imsi [ 0 ] | |
cred - > milenage = = NULL | | ! cred - > milenage [ 0 ] )
continue ;
if ( plmn_id_match ( bss - > anqp_3gpp , cred - > imsi ) )
sep = os_strchr ( cred - > imsi , ' - ' ) ;
if ( sep = = NULL | |
( sep - cred - > imsi ! = 5 & & sep - cred - > imsi ! = 6 ) )
continue ;
if ( plmn_id_match ( bss - > anqp_3gpp , cred - > imsi ,
sep - cred - > imsi - 3 ) )
break ;
}
if ( cred = = NULL )
@ -865,13 +870,21 @@ static struct wpa_cred * interworking_credentials_available_3gpp(
return NULL ;
for ( cred = wpa_s - > conf - > cred ; cred ; cred = cred - > next ) {
char * sep ;
if ( cred - > imsi = = NULL | | ! cred - > imsi [ 0 ] | |
cred - > milenage = = NULL | | ! cred - > milenage [ 0 ] )
continue ;
sep = os_strchr ( cred - > imsi , ' - ' ) ;
if ( sep = = NULL | |
( sep - cred - > imsi ! = 5 & & sep - cred - > imsi ! = 6 ) )
continue ;
wpa_printf ( MSG_DEBUG , " Interworking: Parsing 3GPP info from "
MACSTR , MAC2STR ( bss - > bssid ) ) ;
ret = plmn_id_match ( bss - > anqp_3gpp , cred - > imsi ) ;
ret = plmn_id_match ( bss - > anqp_3gpp , cred - > imsi ,
sep - cred - > imsi - 3 ) ;
wpa_printf ( MSG_DEBUG , " PLMN match %sfound " , ret ? " " : " not " ) ;
if ( ret ) {
if ( selected = = NULL | |