Dropping packets is sometimes perferred behavior. Add drop_packets parameter to NICConf struct and let nic simulation decide how to use it.
Only e1000 supports this for now. Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com> --- Documentation is missing, but I'm not even sure if there's any other user who finds this useful. hw/e1000.c | 4 +++- hw/qdev.c | 1 + net.c | 5 +++++ net.h | 9 +++++++-- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/hw/e1000.c b/hw/e1000.c index fe3e812..57ffdec 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -656,7 +656,9 @@ e1000_can_receive(VLANClientState *nc) { E1000State *s = DO_UPCAST(NICState, nc, nc)->opaque; - return (s->mac_reg[RCTL] & E1000_RCTL_EN) && e1000_has_rxbufs(s, 1); + return (s->conf.flags & NIC_CONF_DROP_PACKETS) || + ((s->mac_reg[RCTL] & E1000_RCTL_EN) && + e1000_has_rxbufs(s, 1)); } static uint64_t rx_desc_base(E1000State *s) diff --git a/hw/qdev.c b/hw/qdev.c index 9519f5d..d8605d6 100644 --- a/hw/qdev.c +++ b/hw/qdev.c @@ -468,6 +468,7 @@ void qdev_set_nic_properties(DeviceState *dev, NICInfo *nd) qdev_prop_exists(dev, "vectors")) { qdev_prop_set_uint32(dev, "vectors", nd->nvectors); } + qdev_prop_set_bit(dev, "drop_packets", nd->drop_packets); } BusState *qdev_get_child_bus(DeviceState *dev, const char *name) diff --git a/net.c b/net.c index 6746bc7..566be48 100644 --- a/net.c +++ b/net.c @@ -798,6 +798,7 @@ static int net_init_nic(QemuOpts *opts, return -1; } + nd->drop_packets = qemu_opt_get_bool(opts, "drop_packets", 0); nd->used = 1; nb_nics++; @@ -864,6 +865,10 @@ static const struct { .name = "vectors", .type = QEMU_OPT_NUMBER, .help = "number of MSI-x vectors, 0 to disable MSI-X", + }, { + .name = "drop_packets", + .type = QEMU_OPT_BOOL, + .help = "drop packets if driver is not ready to receive" }, { /* end of list */ } }, diff --git a/net.h b/net.h index 6ceca50..a594313 100644 --- a/net.h +++ b/net.h @@ -12,19 +12,23 @@ struct MACAddr { }; /* qdev nic properties */ +#define NIC_CONF_DROP_PACKETS_BIT 0 +#define NIC_CONF_DROP_PACKETS (1 << NIC_CONF_DROP_PACKETS_BIT) typedef struct NICConf { MACAddr macaddr; VLANState *vlan; VLANClientState *peer; int32_t bootindex; + uint32_t flags; } NICConf; #define DEFINE_NIC_PROPERTIES(_state, _conf) \ DEFINE_PROP_MACADDR("mac", _state, _conf.macaddr), \ DEFINE_PROP_VLAN("vlan", _state, _conf.vlan), \ DEFINE_PROP_NETDEV("netdev", _state, _conf.peer), \ - DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1) + DEFINE_PROP_INT32("bootindex", _state, _conf.bootindex, -1), \ + DEFINE_PROP_BIT("drop_packets", _state, _conf.flags, NIC_CONF_DROP_PACKETS_BIT, 0) /* VLANs support */ @@ -133,8 +137,9 @@ struct NICInfo { char *devaddr; VLANState *vlan; VLANClientState *netdev; - int used; int nvectors; + unsigned int used : 1; + unsigned int drop_packets : 1; }; extern int nb_nics; -- 1.7.3.4