mirror of https://gitee.com/openkylin/qemu.git
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJVm8g1AAoJEJykq7OBq3PIIGYH/0/b8B5HussDgeKmMt74ZmkL 5lq/+hTJYN1qPWSBXbKI/FGvSFWnM02vrgdNFsc3Zxn3k7ciXrAgYjHbKpx9CMBP iS9PJ1T6aWfxlVPsNQuOmD3z8w9OheEwkck6D7mOEKMRfGTQJisDhNuIidEzIUzW Bk+pe4uCeSehZfZTvS4pJb5R+VNwb3GqEFh8hQaF0/F8yLn6vfqyuKompgsRPiMe qYmafGdxW1h1/0DuzXsn7GHIpnuEyAEslqJbgzvpQHEZTaYDYPyw+mSS9X1XGT7V 4m1BRMr97teYrjq0/Eb++Tc9ZaxuGx9+iJ+JeZzb6tXZvUTIDNArcJIS6k/5hmw= =DE34 -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stefanha/tags/net-pull-request' into staging # gpg: Signature made Tue Jul 7 13:38:13 2015 BST using RSA key ID 81AB73C8 # gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>" # gpg: aka "Stefan Hajnoczi <stefanha@gmail.com>" * remotes/stefanha/tags/net-pull-request: rocker: tests: don't need to specify master/self when setting vlans rocker: mark copy-to-cpu pkts as forwarding offloaded rocker: return -1 when dropping packet on ingress rocker: fix missing break statements rocker: fix misplaced break statement rocker: don't queue receive pkts when port is disabled vmxnet3: Fix incorrect small packet padding e1000: flush packets when link comes up rocker: fix memory leak Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
f2562fbb7a
|
@ -637,6 +637,7 @@ The TLVs for Rx descriptor buffer are:
|
|||
(1 << 5): TCP packet
|
||||
(1 << 6): UDP packet
|
||||
(1 << 7): TCP/UDP csum good
|
||||
(1 << 8): Offload forward
|
||||
RX_CSUM 2 IP calculated checksum:
|
||||
IPv4: IP payload csum
|
||||
IPv6: header and payload csum
|
||||
|
@ -645,6 +646,9 @@ The TLVs for Rx descriptor buffer are:
|
|||
RX_FRAG_MAX_LEN 2 Packet maximum fragment length
|
||||
RX_FRAG_LEN 2 Actual packet fragment length after receive
|
||||
|
||||
Offload forward RX_FLAG indicates the device has already forwarded the packet
|
||||
so the host CPU should not also forward the packet.
|
||||
|
||||
Possible status return codes in descriptor on completion are:
|
||||
|
||||
DESC_COMP_ERR reason
|
||||
|
|
|
@ -185,6 +185,9 @@ e1000_link_up(E1000State *s)
|
|||
{
|
||||
s->mac_reg[STATUS] |= E1000_STATUS_LU;
|
||||
s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS;
|
||||
|
||||
/* E1000_STATUS_LU is tested by e1000_can_receive() */
|
||||
qemu_flush_queued_packets(qemu_get_queue(s->nic));
|
||||
}
|
||||
|
||||
static bool
|
||||
|
|
|
@ -96,7 +96,7 @@ World *rocker_get_world(Rocker *r, enum rocker_world_type type)
|
|||
|
||||
RockerSwitch *qmp_query_rocker(const char *name, Error **errp)
|
||||
{
|
||||
RockerSwitch *rocker = g_malloc0(sizeof(*rocker));
|
||||
RockerSwitch *rocker;
|
||||
Rocker *r;
|
||||
|
||||
r = rocker_find(name);
|
||||
|
@ -106,6 +106,7 @@ RockerSwitch *qmp_query_rocker(const char *name, Error **errp)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
rocker = g_new0(RockerSwitch, 1);
|
||||
rocker->name = g_strdup(r->name);
|
||||
rocker->id = r->switch_id;
|
||||
rocker->ports = r->fp_ports;
|
||||
|
@ -192,11 +193,13 @@ static int tx_consume(Rocker *r, DescInfo *info)
|
|||
if (!tlvs[ROCKER_TLV_TX_L3_CSUM_OFF]) {
|
||||
return -ROCKER_EINVAL;
|
||||
}
|
||||
break;
|
||||
case ROCKER_TX_OFFLOAD_TSO:
|
||||
if (!tlvs[ROCKER_TLV_TX_TSO_MSS] ||
|
||||
!tlvs[ROCKER_TLV_TX_TSO_HDR_LEN]) {
|
||||
return -ROCKER_EINVAL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (tlvs[ROCKER_TLV_TX_L3_CSUM_OFF]) {
|
||||
|
@ -600,7 +603,7 @@ static DescRing *rocker_get_rx_ring_by_pport(Rocker *r,
|
|||
}
|
||||
|
||||
int rx_produce(World *world, uint32_t pport,
|
||||
const struct iovec *iov, int iovcnt)
|
||||
const struct iovec *iov, int iovcnt, uint8_t copy_to_cpu)
|
||||
{
|
||||
Rocker *r = world_rocker(world);
|
||||
PCIDevice *dev = (PCIDevice *)r;
|
||||
|
@ -643,6 +646,10 @@ int rx_produce(World *world, uint32_t pport,
|
|||
goto out;
|
||||
}
|
||||
|
||||
if (copy_to_cpu) {
|
||||
rx_flags |= ROCKER_RX_FLAGS_FWD_OFFLOAD;
|
||||
}
|
||||
|
||||
/* XXX calc rx flags/csum */
|
||||
|
||||
tlv_size = rocker_tlv_total_size(sizeof(uint16_t)) + /* flags */
|
||||
|
|
|
@ -77,7 +77,7 @@ int rocker_event_link_changed(Rocker *r, uint32_t pport, bool link_up);
|
|||
int rocker_event_mac_vlan_seen(Rocker *r, uint32_t pport, uint8_t *addr,
|
||||
uint16_t vlan_id);
|
||||
int rx_produce(World *world, uint32_t pport,
|
||||
const struct iovec *iov, int iovcnt);
|
||||
const struct iovec *iov, int iovcnt, uint8_t copy_to_cpu);
|
||||
int rocker_port_eg(Rocker *r, uint32_t pport,
|
||||
const struct iovec *iov, int iovcnt);
|
||||
|
||||
|
|
|
@ -125,18 +125,21 @@ int fp_port_eg(FpPort *port, const struct iovec *iov, int iovcnt)
|
|||
return ROCKER_OK;
|
||||
}
|
||||
|
||||
static int fp_port_can_receive(NetClientState *nc)
|
||||
{
|
||||
FpPort *port = qemu_get_nic_opaque(nc);
|
||||
|
||||
return port->enabled;
|
||||
}
|
||||
|
||||
static ssize_t fp_port_receive_iov(NetClientState *nc, const struct iovec *iov,
|
||||
int iovcnt)
|
||||
{
|
||||
FpPort *port = qemu_get_nic_opaque(nc);
|
||||
|
||||
/* If the port is disabled, we want to drop this pkt
|
||||
* now rather than queing it for later. We don't want
|
||||
* any stale pkts getting into the device when the port
|
||||
* transitions to enabled.
|
||||
*/
|
||||
|
||||
if (!port->enabled) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return world_ingress(port->world, port->pport, iov, iovcnt);
|
||||
}
|
||||
|
||||
|
@ -165,7 +168,6 @@ static void fp_port_set_link_status(NetClientState *nc)
|
|||
static NetClientInfo fp_port_info = {
|
||||
.type = NET_CLIENT_OPTIONS_KIND_NIC,
|
||||
.size = sizeof(NICState),
|
||||
.can_receive = fp_port_can_receive,
|
||||
.receive = fp_port_receive,
|
||||
.receive_iov = fp_port_receive_iov,
|
||||
.cleanup = fp_port_cleanup,
|
||||
|
|
|
@ -250,6 +250,7 @@ enum {
|
|||
#define ROCKER_RX_FLAGS_TCP (1 << 5)
|
||||
#define ROCKER_RX_FLAGS_UDP (1 << 6)
|
||||
#define ROCKER_RX_FLAGS_TCP_UDP_CSUM_GOOD (1 << 7)
|
||||
#define ROCKER_RX_FLAGS_FWD_OFFLOAD (1 << 8)
|
||||
|
||||
/* Tx msg */
|
||||
enum {
|
||||
|
|
|
@ -825,6 +825,8 @@ static OfDpaGroup *of_dpa_group_alloc(uint32_t id)
|
|||
static void of_dpa_output_l2_interface(OfDpaFlowContext *fc,
|
||||
OfDpaGroup *group)
|
||||
{
|
||||
uint8_t copy_to_cpu = fc->action_set.apply.copy_to_cpu;
|
||||
|
||||
if (group->l2_interface.pop_vlan) {
|
||||
of_dpa_flow_pkt_strip_vlan(fc);
|
||||
}
|
||||
|
@ -837,7 +839,8 @@ static void of_dpa_output_l2_interface(OfDpaFlowContext *fc,
|
|||
*/
|
||||
|
||||
if (group->l2_interface.out_pport == 0) {
|
||||
rx_produce(fc->of_dpa->world, fc->in_pport, fc->iov, fc->iovcnt);
|
||||
rx_produce(fc->of_dpa->world, fc->in_pport, fc->iov, fc->iovcnt,
|
||||
copy_to_cpu);
|
||||
} else if (group->l2_interface.out_pport != fc->in_pport) {
|
||||
rocker_port_eg(world_rocker(fc->of_dpa->world),
|
||||
group->l2_interface.out_pport,
|
||||
|
@ -2525,7 +2528,6 @@ static void of_dpa_group_fill(void *key, void *value, void *user_data)
|
|||
ngroup->has_set_vlan_id = true;
|
||||
ngroup->set_vlan_id = ntohs(group->l2_rewrite.vlan_id);
|
||||
}
|
||||
break;
|
||||
if (memcmp(group->l2_rewrite.src_mac.a, zero_mac.a, ETH_ALEN)) {
|
||||
ngroup->has_set_eth_src = true;
|
||||
ngroup->set_eth_src =
|
||||
|
@ -2536,6 +2538,7 @@ static void of_dpa_group_fill(void *key, void *value, void *user_data)
|
|||
ngroup->set_eth_dst =
|
||||
qemu_mac_strdup_printf(group->l2_rewrite.dst_mac.a);
|
||||
}
|
||||
break;
|
||||
case ROCKER_OF_DPA_GROUP_TYPE_L2_FLOOD:
|
||||
case ROCKER_OF_DPA_GROUP_TYPE_L2_MCAST:
|
||||
ngroup->has_vlan_id = true;
|
||||
|
|
|
@ -32,7 +32,7 @@ ssize_t world_ingress(World *world, uint32_t pport,
|
|||
return world->ops->ig(world, pport, iov, iovcnt);
|
||||
}
|
||||
|
||||
return iov_size(iov, iovcnt);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int world_do_cmd(World *world, DescInfo *info,
|
||||
|
|
|
@ -1879,6 +1879,12 @@ vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
|||
return -1;
|
||||
}
|
||||
|
||||
if (s->peer_has_vhdr) {
|
||||
vmxnet_rx_pkt_set_vhdr(s->rx_pkt, (struct virtio_net_hdr *)buf);
|
||||
buf += sizeof(struct virtio_net_hdr);
|
||||
size -= sizeof(struct virtio_net_hdr);
|
||||
}
|
||||
|
||||
/* Pad to minimum Ethernet frame length */
|
||||
if (size < sizeof(min_buf)) {
|
||||
memcpy(min_buf, buf, size);
|
||||
|
@ -1887,12 +1893,6 @@ vmxnet3_receive(NetClientState *nc, const uint8_t *buf, size_t size)
|
|||
size = sizeof(min_buf);
|
||||
}
|
||||
|
||||
if (s->peer_has_vhdr) {
|
||||
vmxnet_rx_pkt_set_vhdr(s->rx_pkt, (struct virtio_net_hdr *)buf);
|
||||
buf += sizeof(struct virtio_net_hdr);
|
||||
size -= sizeof(struct virtio_net_hdr);
|
||||
}
|
||||
|
||||
vmxnet_rx_pkt_set_packet_type(s->rx_pkt,
|
||||
get_eth_packet_type(PKT_GET_ETH_HDR(buf)));
|
||||
|
||||
|
|
|
@ -20,8 +20,8 @@ simp ssh tut sw1 --cmd "echo 1 | sudo dd of=/sys/class/net/br0/bridge/vlan_filte
|
|||
|
||||
# add both ports to VLAN 57
|
||||
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p1 master self"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p2 master self"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p1"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p2"
|
||||
|
||||
# turn off learning and flooding in SW
|
||||
|
||||
|
|
|
@ -21,8 +21,8 @@ simp ssh tut sw1 --cmd "echo 1 | sudo dd of=/sys/class/net/br0/bridge/vlan_filte
|
|||
|
||||
# add both ports to VLAN 57
|
||||
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p1 master self"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p2 master self"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p1"
|
||||
simp ssh tut sw1 --cmd "sudo /sbin/bridge vlan add vid 57 dev sw1p2"
|
||||
|
||||
# turn off learning and flooding in SW
|
||||
|
||||
|
|
Loading…
Reference in New Issue