mirror of https://gitee.com/openkylin/qemu.git
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1 iQEcBAABAgAGBQJYo88zAAoJEO8Ells5jWIRal0H/3iRDDvo6lj+mjQySNBOdMZJ BGqqG6SqqX6kJaoBldAyIyVpRWOrVPZGkX4HfUQkAcdWtv5QRMselyhOlhxJRYD8 jUixpxX2oXD/gokkbsMJOH5KMPea5E7J/IBWC9c+Rgh6VV91r0/pML68piA8sDqU GZpNVhCWwUBEx4ZWy1wdKpreEsNy7fb3MuWmqFDNGSLEN2/JCqx+mrY+WvagmGAM HpmcS4Sflm5OUi7dcedB7gcYCbeIAIjaxKpjWtHaHlyFmdFlwDXFFEXlEHjrpjqw SrYacth/Xj/lcbRFQ65dMe7lxtKvt8a9PW4RVD/Iiw3bHj9bEmdGd+Ki815DcQg= =O8NL -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/jasowang/tags/net-pull-request' into staging # gpg: Signature made Wed 15 Feb 2017 03:46:59 GMT # gpg: using RSA key 0xEF04965B398D6211 # gpg: Good signature from "Jason Wang (Jason Wang on RedHat) <jasowang@redhat.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 215D 46F4 8246 689E C77F 3562 EF04 965B 398D 6211 * remotes/jasowang/tags/net-pull-request: net: e1000e: fix an infinite loop issue net: imx: limit buffer descriptor count colo-compare: sort TCP packet queue by sequence number net: e1000e: fix dead code in e1000e_write_packet_to_guest net: Mark 'vlan' parameter as deprecated Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
ca5266de6c
|
@ -806,7 +806,8 @@ typedef struct E1000E_RingInfo_st {
|
|||
static inline bool
|
||||
e1000e_ring_empty(E1000ECore *core, const E1000E_RingInfo *r)
|
||||
{
|
||||
return core->mac[r->dh] == core->mac[r->dt];
|
||||
return core->mac[r->dh] == core->mac[r->dt] ||
|
||||
core->mac[r->dt] >= core->mac[r->dlen] / E1000_RING_DESC_LEN;
|
||||
}
|
||||
|
||||
static inline uint64_t
|
||||
|
@ -1507,6 +1508,7 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
|||
const E1000E_RingInfo *rxi;
|
||||
size_t ps_hdr_len = 0;
|
||||
bool do_ps = e1000e_do_ps(core, pkt, &ps_hdr_len);
|
||||
bool is_first = true;
|
||||
|
||||
rxi = rxr->i;
|
||||
|
||||
|
@ -1514,7 +1516,6 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
|||
hwaddr ba[MAX_PS_BUFFERS];
|
||||
e1000e_ba_state bastate = { { 0 } };
|
||||
bool is_last = false;
|
||||
bool is_first = true;
|
||||
|
||||
desc_size = total_size - desc_offset;
|
||||
|
||||
|
@ -1522,6 +1523,10 @@ e1000e_write_packet_to_guest(E1000ECore *core, struct NetRxPkt *pkt,
|
|||
desc_size = core->rx_desc_buf_size;
|
||||
}
|
||||
|
||||
if (e1000e_ring_empty(core, rxi)) {
|
||||
return;
|
||||
}
|
||||
|
||||
base = e1000e_ring_head_descr(core, rxi);
|
||||
|
||||
pci_dma_read(d, base, &desc, core->rx_desc_len);
|
||||
|
|
|
@ -55,6 +55,8 @@
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
#define IMX_MAX_DESC 1024
|
||||
|
||||
static const char *imx_default_reg_name(IMXFECState *s, uint32_t index)
|
||||
{
|
||||
static char tmp[20];
|
||||
|
@ -402,12 +404,12 @@ static void imx_eth_update(IMXFECState *s)
|
|||
|
||||
static void imx_fec_do_tx(IMXFECState *s)
|
||||
{
|
||||
int frame_size = 0;
|
||||
int frame_size = 0, descnt = 0;
|
||||
uint8_t frame[ENET_MAX_FRAME_SIZE];
|
||||
uint8_t *ptr = frame;
|
||||
uint32_t addr = s->tx_descriptor;
|
||||
|
||||
while (1) {
|
||||
while (descnt++ < IMX_MAX_DESC) {
|
||||
IMXFECBufDesc bd;
|
||||
int len;
|
||||
|
||||
|
@ -453,12 +455,12 @@ static void imx_fec_do_tx(IMXFECState *s)
|
|||
|
||||
static void imx_enet_do_tx(IMXFECState *s)
|
||||
{
|
||||
int frame_size = 0;
|
||||
int frame_size = 0, descnt = 0;
|
||||
uint8_t frame[ENET_MAX_FRAME_SIZE];
|
||||
uint8_t *ptr = frame;
|
||||
uint32_t addr = s->tx_descriptor;
|
||||
|
||||
while (1) {
|
||||
while (descnt++ < IMX_MAX_DESC) {
|
||||
IMXENETBufDesc bd;
|
||||
int len;
|
||||
|
||||
|
|
|
@ -101,6 +101,15 @@ static int compare_chr_send(CharBackend *out,
|
|||
const uint8_t *buf,
|
||||
uint32_t size);
|
||||
|
||||
static gint seq_sorter(Packet *a, Packet *b, gpointer data)
|
||||
{
|
||||
struct tcphdr *atcp, *btcp;
|
||||
|
||||
atcp = (struct tcphdr *)(a->transport_header);
|
||||
btcp = (struct tcphdr *)(b->transport_header);
|
||||
return ntohl(atcp->th_seq) - ntohl(btcp->th_seq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 0 on success, if return -1 means the pkt
|
||||
* is unsupported(arp and ipv6) and will be sent later
|
||||
|
@ -137,6 +146,11 @@ static int packet_enqueue(CompareState *s, int mode)
|
|||
if (g_queue_get_length(&conn->primary_list) <=
|
||||
MAX_QUEUE_SIZE) {
|
||||
g_queue_push_tail(&conn->primary_list, pkt);
|
||||
if (conn->ip_proto == IPPROTO_TCP) {
|
||||
g_queue_sort(&conn->primary_list,
|
||||
(GCompareDataFunc)seq_sorter,
|
||||
NULL);
|
||||
}
|
||||
} else {
|
||||
error_report("colo compare primary queue size too big,"
|
||||
"drop packet");
|
||||
|
@ -145,6 +159,11 @@ static int packet_enqueue(CompareState *s, int mode)
|
|||
if (g_queue_get_length(&conn->secondary_list) <=
|
||||
MAX_QUEUE_SIZE) {
|
||||
g_queue_push_tail(&conn->secondary_list, pkt);
|
||||
if (conn->ip_proto == IPPROTO_TCP) {
|
||||
g_queue_sort(&conn->secondary_list,
|
||||
(GCompareDataFunc)seq_sorter,
|
||||
NULL);
|
||||
}
|
||||
} else {
|
||||
error_report("colo compare secondary queue size too big,"
|
||||
"drop packet");
|
||||
|
|
|
@ -970,6 +970,7 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
|
|||
const Netdev *netdev;
|
||||
const char *name;
|
||||
NetClientState *peer = NULL;
|
||||
static bool vlan_warned;
|
||||
|
||||
if (is_netdev) {
|
||||
netdev = object;
|
||||
|
@ -1050,6 +1051,11 @@ static int net_client_init1(const void *object, bool is_netdev, Error **errp)
|
|||
!opts->u.nic.data->has_netdev) {
|
||||
peer = net_hub_add_port(net->has_vlan ? net->vlan : 0, NULL);
|
||||
}
|
||||
|
||||
if (net->has_vlan && !vlan_warned) {
|
||||
error_report("'vlan' is deprecated. Please use 'netdev' instead.");
|
||||
vlan_warned = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (net_client_init_fun[netdev->type](netdev, name, peer, errp) < 0) {
|
||||
|
|
Loading…
Reference in New Issue