@ -289,7 +289,7 @@ NICState *qemu_new_nic(NetClientInfo *info,
NICState * nic ;
int i , queues = MAX ( 1 , conf - > peers . queues ) ;
assert ( info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) ;
assert ( info - > type = = NET_CLIENT_DRIVER _NIC ) ;
assert ( info - > size > = sizeof ( NICState ) ) ;
nic = g_malloc0 ( info - > size + sizeof ( NetClientState ) * queues ) ;
@ -360,13 +360,13 @@ void qemu_del_net_client(NetClientState *nc)
int queues , i ;
NetFilterState * nf , * next ;
assert ( nc - > info - > type ! = NET_CLIENT_OPTIONS_KIN D_NIC ) ;
assert ( nc - > info - > type ! = NET_CLIENT_DRIVER _NIC ) ;
/* If the NetClientState belongs to a multiqueue backend, we will change all
* other NetClientStates also .
*/
queues = qemu_find_net_clients_except ( nc - > name , ncs ,
NET_CLIENT_OPTIONS_KIN D_NIC ,
NET_CLIENT_DRIVER _NIC ,
MAX_QUEUE_NUM ) ;
assert ( queues ! = 0 ) ;
@ -375,7 +375,7 @@ void qemu_del_net_client(NetClientState *nc)
}
/* If there is a peer NIC, delete and cleanup client, but do not free. */
if ( nc - > peer & & nc - > peer - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > peer & & nc - > peer - > info - > type = = NET_CLIENT_DRIVER _NIC ) {
NICState * nic = qemu_get_nic ( nc - > peer ) ;
if ( nic - > peer_deleted ) {
return ;
@ -431,7 +431,7 @@ void qemu_foreach_nic(qemu_nic_foreach func, void *opaque)
NetClientState * nc ;
QTAILQ_FOREACH ( nc , & net_clients , next ) {
if ( nc - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > info - > type = = NET_CLIENT_DRIVER _NIC ) {
if ( nc - > queue_index = = 0 ) {
func ( qemu_get_nic ( nc ) , opaque ) ;
}
@ -603,7 +603,7 @@ void qemu_flush_or_purge_queued_packets(NetClientState *nc, bool purge)
{
nc - > receive_disabled = 0 ;
if ( nc - > peer & & nc - > peer - > info - > type = = NET_CLIENT_OPTIONS_KIN D_HUBPORT ) {
if ( nc - > peer & & nc - > peer - > info - > type = = NET_CLIENT_DRIVER _HUBPORT ) {
if ( net_hub_flush ( nc - > peer ) ) {
qemu_notify_event ( ) ;
}
@ -777,7 +777,7 @@ NetClientState *qemu_find_netdev(const char *id)
NetClientState * nc ;
QTAILQ_FOREACH ( nc , & net_clients , next ) {
if ( nc - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC )
if ( nc - > info - > type = = NET_CLIENT_DRIVER _NIC )
continue ;
if ( ! strcmp ( nc - > name , id ) ) {
return nc ;
@ -788,7 +788,7 @@ NetClientState *qemu_find_netdev(const char *id)
}
int qemu_find_net_clients_except ( const char * id , NetClientState * * ncs ,
NetClientOptionsKind type , int max )
NetClientDriver type , int max )
{
NetClientState * nc ;
int ret = 0 ;
@ -869,8 +869,8 @@ static int net_init_nic(const Netdev *netdev, const char *name,
NICInfo * nd ;
const NetLegacyNicOptions * nic ;
assert ( netdev - > opts - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) ;
nic = netdev - > opts - > u . nic . data ;
assert ( netdev - > type = = NET_CLIENT_DRIVER _NIC ) ;
nic = & netdev - > u . nic ;
idx = nic_get_free_idx ( ) ;
if ( idx = = - 1 | | nb_nics > = MAX_NICS ) {
@ -930,39 +930,38 @@ static int net_init_nic(const Netdev *netdev, const char *name,
}
static int ( * const net_client_init_fun [ NET_CLIENT_OPTIONS_KIN D__MAX ] ) (
static int ( * const net_client_init_fun [ NET_CLIENT_DRIVER __MAX ] ) (
const Netdev * netdev ,
const char * name ,
NetClientState * peer , Error * * errp ) = {
[ NET_CLIENT_OPTIONS_KIN D_NIC ] = net_init_nic ,
[ NET_CLIENT_DRIVER _NIC ] = net_init_nic ,
# ifdef CONFIG_SLIRP
[ NET_CLIENT_OPTIONS_KIN D_USER ] = net_init_slirp ,
[ NET_CLIENT_DRIVER _USER ] = net_init_slirp ,
# endif
[ NET_CLIENT_OPTIONS_KIN D_TAP ] = net_init_tap ,
[ NET_CLIENT_OPTIONS_KIN D_SOCKET ] = net_init_socket ,
[ NET_CLIENT_DRIVER _TAP ] = net_init_tap ,
[ NET_CLIENT_DRIVER _SOCKET ] = net_init_socket ,
# ifdef CONFIG_VDE
[ NET_CLIENT_OPTIONS_KIN D_VDE ] = net_init_vde ,
[ NET_CLIENT_DRIVER _VDE ] = net_init_vde ,
# endif
# ifdef CONFIG_NETMAP
[ NET_CLIENT_OPTIONS_KIN D_NETMAP ] = net_init_netmap ,
[ NET_CLIENT_DRIVER _NETMAP ] = net_init_netmap ,
# endif
[ NET_CLIENT_OPTIONS_KIN D_DUMP ] = net_init_dump ,
[ NET_CLIENT_DRIVER _DUMP ] = net_init_dump ,
# ifdef CONFIG_NET_BRIDGE
[ NET_CLIENT_OPTIONS_KIN D_BRIDGE ] = net_init_bridge ,
[ NET_CLIENT_DRIVER _BRIDGE ] = net_init_bridge ,
# endif
[ NET_CLIENT_OPTIONS_KIN D_HUBPORT ] = net_init_hubport ,
[ NET_CLIENT_DRIVER _HUBPORT ] = net_init_hubport ,
# ifdef CONFIG_VHOST_NET_USED
[ NET_CLIENT_OPTIONS_KIN D_VHOST_USER ] = net_init_vhost_user ,
[ NET_CLIENT_DRIVER _VHOST_USER ] = net_init_vhost_user ,
# endif
# ifdef CONFIG_L2TPV3
[ NET_CLIENT_OPTIONS_KIN D_L2TPV3 ] = net_init_l2tpv3 ,
[ NET_CLIENT_DRIVER _L2TPV3 ] = net_init_l2tpv3 ,
# endif
} ;
static int net_client_init1 ( const void * object , int is_netdev , Error * * errp )
{
const NetClientOptions * opts ;
Netdev legacy = { 0 } ;
const Netdev * netdev ;
const char * name ;
@ -970,34 +969,72 @@ static int net_client_init1(const void *object, int is_netdev, Error **errp)
if ( is_netdev ) {
netdev = object ;
opts = netdev - > opts ;
name = netdev - > id ;
if ( opts - > type = = NET_CLIENT_OPTIONS_KIN D_DUMP | |
opts - > type = = NET_CLIENT_OPTIONS_KIN D_NIC | |
! net_client_init_fun [ opts - > type ] ) {
if ( netdev - > type = = NET_CLIENT_DRIVER _DUMP | |
netdev - > type = = NET_CLIENT_DRIVER _NIC | |
! net_client_init_fun [ netdev - > type ] ) {
error_setg ( errp , QERR_INVALID_PARAMETER_VALUE , " type " ,
" a netdev backend type " ) ;
return - 1 ;
}
} else {
const NetLegacy * net = object ;
const NetLegacyOptions * opts = net - > opts ;
legacy . id = net - > id ;
opts = legacy . opts = net - > opts ;
netdev = & legacy ;
/* missing optional values have been initialized to "all bits zero" */
name = net - > has_id ? net - > id : net - > name ;
if ( opts - > type = = NET_CLIENT_OPTIONS_KIND_NONE ) {
/* Map the old options to the new flat type */
switch ( opts - > type ) {
case NET_LEGACY_OPTIONS_KIND_NONE :
return 0 ; /* nothing to do */
}
if ( opts - > type = = NET_CLIENT_OPTIONS_KIND_HUBPORT ) {
error_setg ( errp , QERR_INVALID_PARAMETER_VALUE , " type " ,
" a net type " ) ;
return - 1 ;
case NET_LEGACY_OPTIONS_KIND_NIC :
legacy . type = NET_CLIENT_DRIVER_NIC ;
legacy . u . nic = * opts - > u . nic . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_USER :
legacy . type = NET_CLIENT_DRIVER_USER ;
legacy . u . user = * opts - > u . user . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_TAP :
legacy . type = NET_CLIENT_DRIVER_TAP ;
legacy . u . tap = * opts - > u . tap . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_L2TPV3 :
legacy . type = NET_CLIENT_DRIVER_L2TPV3 ;
legacy . u . l2tpv3 = * opts - > u . l2tpv3 . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_SOCKET :
legacy . type = NET_CLIENT_DRIVER_SOCKET ;
legacy . u . socket = * opts - > u . socket . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_VDE :
legacy . type = NET_CLIENT_DRIVER_VDE ;
legacy . u . vde = * opts - > u . vde . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_DUMP :
legacy . type = NET_CLIENT_DRIVER_DUMP ;
legacy . u . dump = * opts - > u . dump . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_BRIDGE :
legacy . type = NET_CLIENT_DRIVER_BRIDGE ;
legacy . u . bridge = * opts - > u . bridge . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_NETMAP :
legacy . type = NET_CLIENT_DRIVER_NETMAP ;
legacy . u . netmap = * opts - > u . netmap . data ;
break ;
case NET_LEGACY_OPTIONS_KIND_VHOST_USER :
legacy . type = NET_CLIENT_DRIVER_VHOST_USER ;
legacy . u . vhost_user = * opts - > u . vhost_user . data ;
break ;
default :
abort ( ) ;
}
if ( ! net_client_init_fun [ opts - > type ] ) {
if ( ! net_client_init_fun [ netdev - > type ] ) {
error_setg ( errp , QERR_INVALID_PARAMETER_VALUE , " type " ,
" a net backend type (maybe it is not compiled "
" into this binary) " ) ;
@ -1005,17 +1042,17 @@ static int net_client_init1(const void *object, int is_netdev, Error **errp)
}
/* Do not add to a vlan if it's a nic with a netdev= parameter. */
if ( opts - > type ! = NET_CLIENT_OPTIONS_KIN D_NIC | |
if ( netdev - > type ! = NET_CLIENT_DRIVER _NIC | |
! opts - > u . nic . data - > has_netdev ) {
peer = net_hub_add_port ( net - > has_vlan ? net - > vlan : 0 , NULL ) ;
}
}
if ( net_client_init_fun [ opts - > type ] ( netdev , name , peer , errp ) < 0 ) {
if ( net_client_init_fun [ netdev - > type ] ( netdev , name , peer , errp ) < 0 ) {
/* FIXME drop when all init functions store an Error */
if ( errp & & ! * errp ) {
error_setg ( errp , QERR_DEVICE_INIT_FAILED ,
NetClientOptionsKind_lookup [ opts - > type ] ) ;
NetClientDriver_lookup [ netdev - > type ] ) ;
}
return - 1 ;
}
@ -1135,7 +1172,7 @@ void hmp_host_net_remove(Monitor *mon, const QDict *qdict)
device , vlan_id ) ;
return ;
}
if ( nc - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > info - > type = = NET_CLIENT_DRIVER _NIC ) {
error_report ( " invalid host network device '%s' " , device ) ;
return ;
}
@ -1226,7 +1263,7 @@ void print_net_client(Monitor *mon, NetClientState *nc)
monitor_printf ( mon , " %s: index=%d,type=%s,%s \n " , nc - > name ,
nc - > queue_index ,
NetClientOptionsKind _lookup [ nc - > info - > type ] ,
NetClientDriver _lookup [ nc - > info - > type ] ,
nc - > info_str ) ;
if ( ! QTAILQ_EMPTY ( & nc - > filters ) ) {
monitor_printf ( mon , " filters: \n " ) ;
@ -1256,7 +1293,7 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
}
/* only query rx-filter information of NIC */
if ( nc - > info - > type ! = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > info - > type ! = NET_CLIENT_DRIVER _NIC ) {
if ( has_name ) {
error_setg ( errp , " net client(%s) isn't a NIC " , name ) ;
return NULL ;
@ -1302,7 +1339,7 @@ RxFilterInfoList *qmp_query_rx_filter(bool has_name, const char *name,
void hmp_info_network ( Monitor * mon , const QDict * qdict )
{
NetClientState * nc , * peer ;
NetClientOptionsKind type ;
NetClientDriver type ;
net_hub_info ( mon ) ;
@ -1315,10 +1352,10 @@ void hmp_info_network(Monitor *mon, const QDict *qdict)
continue ;
}
if ( ! peer | | type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( ! peer | | type = = NET_CLIENT_DRIVER _NIC ) {
print_net_client ( mon , nc ) ;
} /* else it's a netdev connected to a NIC, printed with the NIC */
if ( peer & & type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( peer & & type = = NET_CLIENT_DRIVER _NIC ) {
monitor_printf ( mon , " \\ " ) ;
print_net_client ( mon , peer ) ;
}
@ -1332,7 +1369,7 @@ void qmp_set_link(const char *name, bool up, Error **errp)
int queues , i ;
queues = qemu_find_net_clients_except ( name , ncs ,
NET_CLIENT_OPTIONS_KIN D__MAX ,
NET_CLIENT_DRIVER __MAX ,
MAX_QUEUE_NUM ) ;
if ( queues = = 0 ) {
@ -1359,7 +1396,7 @@ void qmp_set_link(const char *name, bool up, Error **errp)
* multiple clients that can still communicate with each other in
* disconnected mode . For now maintain this compatibility .
*/
if ( nc - > peer - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > peer - > info - > type = = NET_CLIENT_DRIVER _NIC ) {
for ( i = 0 ; i < queues ; i + + ) {
ncs [ i ] - > peer - > link_down = ! up ;
}
@ -1400,7 +1437,7 @@ void net_cleanup(void)
*/
while ( ! QTAILQ_EMPTY ( & net_clients ) ) {
nc = QTAILQ_FIRST ( & net_clients ) ;
if ( nc - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ) {
if ( nc - > info - > type = = NET_CLIENT_DRIVER _NIC ) {
qemu_del_nic ( qemu_get_nic ( nc ) ) ;
} else {
qemu_del_net_client ( nc ) ;
@ -1420,7 +1457,7 @@ void net_check_clients(void)
QTAILQ_FOREACH ( nc , & net_clients , next ) {
if ( ! nc - > peer ) {
fprintf ( stderr , " Warning: %s %s has no peer \n " ,
nc - > info - > type = = NET_CLIENT_OPTIONS_KIN D_NIC ?
nc - > info - > type = = NET_CLIENT_DRIVER _NIC ?
" nic " : " netdev " , nc - > name ) ;
}
}