@ -7844,61 +7844,6 @@ static int wpas_ctrl_event_test(struct wpa_supplicant *wpa_s, const char *cmd)
# endif /* CONFIG_TESTING_OPTIONS */
# endif /* CONFIG_TESTING_OPTIONS */
static void wpas_ctrl_vendor_elem_update ( struct wpa_supplicant * wpa_s )
{
unsigned int i ;
char buf [ 30 ] ;
wpa_printf ( MSG_DEBUG , " Update vendor elements " ) ;
for ( i = 0 ; i < NUM_VENDOR_ELEM_FRAMES ; i + + ) {
if ( wpa_s - > vendor_elem [ i ] ) {
int res ;
res = os_snprintf ( buf , sizeof ( buf ) , " frame[%u] " , i ) ;
if ( ! os_snprintf_error ( sizeof ( buf ) , res ) ) {
wpa_hexdump_buf ( MSG_DEBUG , buf ,
wpa_s - > vendor_elem [ i ] ) ;
}
}
}
# ifdef CONFIG_P2P
if ( wpa_s - > parent = = wpa_s & &
wpa_s - > global - > p2p & &
! wpa_s - > global - > p2p_disabled )
p2p_set_vendor_elems ( wpa_s - > global - > p2p , wpa_s - > vendor_elem ) ;
# endif /* CONFIG_P2P */
}
static struct wpa_supplicant *
wpas_ctrl_vendor_elem_iface ( struct wpa_supplicant * wpa_s ,
enum wpa_vendor_elem_frame frame )
{
switch ( frame ) {
# ifdef CONFIG_P2P
case VENDOR_ELEM_PROBE_REQ_P2P :
case VENDOR_ELEM_PROBE_RESP_P2P :
case VENDOR_ELEM_PROBE_RESP_P2P_GO :
case VENDOR_ELEM_BEACON_P2P_GO :
case VENDOR_ELEM_P2P_PD_REQ :
case VENDOR_ELEM_P2P_PD_RESP :
case VENDOR_ELEM_P2P_GO_NEG_REQ :
case VENDOR_ELEM_P2P_GO_NEG_RESP :
case VENDOR_ELEM_P2P_GO_NEG_CONF :
case VENDOR_ELEM_P2P_INV_REQ :
case VENDOR_ELEM_P2P_INV_RESP :
case VENDOR_ELEM_P2P_ASSOC_REQ :
case VENDOR_ELEM_P2P_ASSOC_RESP :
return wpa_s - > parent ;
# endif /* CONFIG_P2P */
default :
return wpa_s ;
}
}
static int wpas_ctrl_vendor_elem_add ( struct wpa_supplicant * wpa_s , char * cmd )
static int wpas_ctrl_vendor_elem_add ( struct wpa_supplicant * wpa_s , char * cmd )
{
{
char * pos = cmd ;
char * pos = cmd ;
@ -7910,7 +7855,7 @@ static int wpas_ctrl_vendor_elem_add(struct wpa_supplicant *wpa_s, char *cmd)
frame = atoi ( pos ) ;
frame = atoi ( pos ) ;
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
return - 1 ;
return - 1 ;
wpa_s = wpas_ ctrl_ vendor_elem_iface ( wpa_s , frame ) ;
wpa_s = wpas_ vendor_elem( wpa_s , frame ) ;
pos = os_strchr ( pos , ' ' ) ;
pos = os_strchr ( pos , ' ' ) ;
if ( pos = = NULL )
if ( pos = = NULL )
@ -7941,7 +7886,7 @@ static int wpas_ctrl_vendor_elem_add(struct wpa_supplicant *wpa_s, char *cmd)
if ( wpa_s - > vendor_elem [ frame ] = = NULL ) {
if ( wpa_s - > vendor_elem [ frame ] = = NULL ) {
wpa_s - > vendor_elem [ frame ] = buf ;
wpa_s - > vendor_elem [ frame ] = buf ;
wpas_ ctrl_ vendor_elem_update( wpa_s ) ;
wpas_ vendor_elem_update( wpa_s ) ;
return 0 ;
return 0 ;
}
}
@ -7952,7 +7897,7 @@ static int wpas_ctrl_vendor_elem_add(struct wpa_supplicant *wpa_s, char *cmd)
wpabuf_put_buf ( wpa_s - > vendor_elem [ frame ] , buf ) ;
wpabuf_put_buf ( wpa_s - > vendor_elem [ frame ] , buf ) ;
wpabuf_free ( buf ) ;
wpabuf_free ( buf ) ;
wpas_ ctrl_ vendor_elem_update( wpa_s ) ;
wpas_ vendor_elem_update( wpa_s ) ;
return 0 ;
return 0 ;
}
}
@ -7965,7 +7910,7 @@ static int wpas_ctrl_vendor_elem_get(struct wpa_supplicant *wpa_s, char *cmd,
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
return - 1 ;
return - 1 ;
wpa_s = wpas_ ctrl_ vendor_elem_iface ( wpa_s , frame ) ;
wpa_s = wpas_ vendor_elem( wpa_s , frame ) ;
if ( wpa_s - > vendor_elem [ frame ] = = NULL )
if ( wpa_s - > vendor_elem [ frame ] = = NULL )
return 0 ;
return 0 ;
@ -7983,12 +7928,12 @@ static int wpas_ctrl_vendor_elem_remove(struct wpa_supplicant *wpa_s, char *cmd)
size_t len ;
size_t len ;
u8 * buf ;
u8 * buf ;
struct ieee802_11_elems elems ;
struct ieee802_11_elems elems ;
u8 * ie , * end ;
int res ;
frame = atoi ( pos ) ;
frame = atoi ( pos ) ;
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
if ( frame < 0 | | frame > = NUM_VENDOR_ELEM_FRAMES )
return - 1 ;
return - 1 ;
wpa_s = wpas_ ctrl_ vendor_elem_iface ( wpa_s , frame ) ;
wpa_s = wpas_ vendor_elem( wpa_s , frame ) ;
pos = os_strchr ( pos , ' ' ) ;
pos = os_strchr ( pos , ' ' ) ;
if ( pos = = NULL )
if ( pos = = NULL )
@ -7998,7 +7943,7 @@ static int wpas_ctrl_vendor_elem_remove(struct wpa_supplicant *wpa_s, char *cmd)
if ( * pos = = ' * ' ) {
if ( * pos = = ' * ' ) {
wpabuf_free ( wpa_s - > vendor_elem [ frame ] ) ;
wpabuf_free ( wpa_s - > vendor_elem [ frame ] ) ;
wpa_s - > vendor_elem [ frame ] = NULL ;
wpa_s - > vendor_elem [ frame ] = NULL ;
wpas_ ctrl_ vendor_elem_update( wpa_s ) ;
wpas_ vendor_elem_update( wpa_s ) ;
return 0 ;
return 0 ;
}
}
@ -8026,31 +7971,9 @@ static int wpas_ctrl_vendor_elem_remove(struct wpa_supplicant *wpa_s, char *cmd)
return - 1 ;
return - 1 ;
}
}
ie = wpabuf_mhead_u8 ( wpa_s - > vendor_elem [ frame ] ) ;
res = wpas_vendor_elem_remove ( wpa_s , frame , buf , len ) ;
end = ie + wpabuf_len ( wpa_s - > vendor_elem [ frame ] ) ;
for ( ; ie + 1 < end ; ie + = 2 + ie [ 1 ] ) {
if ( ie + len > end )
break ;
if ( os_memcmp ( ie , buf , len ) ! = 0 )
continue ;
if ( wpabuf_len ( wpa_s - > vendor_elem [ frame ] ) = = len ) {
wpabuf_free ( wpa_s - > vendor_elem [ frame ] ) ;
wpa_s - > vendor_elem [ frame ] = NULL ;
} else {
os_memmove ( ie , ie + len ,
end - ( ie + len ) ) ;
wpa_s - > vendor_elem [ frame ] - > used - = len ;
}
os_free ( buf ) ;
wpas_ctrl_vendor_elem_update ( wpa_s ) ;
return 0 ;
}
os_free ( buf ) ;
os_free ( buf ) ;
return res ;
return - 1 ;
}
}