igb: check oversized packets for VMDq
Signed-off-by: Sriram Yagnaraman <sriram.yagnaraman@est.tech> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
3269ebb3e0
commit
5f12d70304
|
@ -921,12 +921,26 @@ igb_rx_l4_cso_enabled(IGBCore *core)
|
||||||
return !!(core->mac[RXCSUM] & E1000_RXCSUM_TUOFLD);
|
return !!(core->mac[RXCSUM] & E1000_RXCSUM_TUOFLD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
igb_rx_is_oversized(IGBCore *core, uint16_t qn, size_t size)
|
||||||
|
{
|
||||||
|
uint16_t pool = qn % IGB_NUM_VM_POOLS;
|
||||||
|
bool lpe = !!(core->mac[VMOLR0 + pool] & E1000_VMOLR_LPE);
|
||||||
|
int max_ethernet_lpe_size =
|
||||||
|
core->mac[VMOLR0 + pool] & E1000_VMOLR_RLPML_MASK;
|
||||||
|
int max_ethernet_vlan_size = 1522;
|
||||||
|
|
||||||
|
return size > (lpe ? max_ethernet_lpe_size : max_ethernet_vlan_size);
|
||||||
|
}
|
||||||
|
|
||||||
static uint16_t igb_receive_assign(IGBCore *core, const struct eth_header *ehdr,
|
static uint16_t igb_receive_assign(IGBCore *core, const struct eth_header *ehdr,
|
||||||
E1000E_RSSInfo *rss_info, bool *external_tx)
|
size_t size, E1000E_RSSInfo *rss_info,
|
||||||
|
bool *external_tx)
|
||||||
{
|
{
|
||||||
static const int ta_shift[] = { 4, 3, 2, 0 };
|
static const int ta_shift[] = { 4, 3, 2, 0 };
|
||||||
uint32_t f, ra[2], *macp, rctl = core->mac[RCTL];
|
uint32_t f, ra[2], *macp, rctl = core->mac[RCTL];
|
||||||
uint16_t queues = 0;
|
uint16_t queues = 0;
|
||||||
|
uint16_t oversized = 0;
|
||||||
uint16_t vid = lduw_be_p(&PKT_GET_VLAN_HDR(ehdr)->h_tci) & VLAN_VID_MASK;
|
uint16_t vid = lduw_be_p(&PKT_GET_VLAN_HDR(ehdr)->h_tci) & VLAN_VID_MASK;
|
||||||
bool accepted = false;
|
bool accepted = false;
|
||||||
int i;
|
int i;
|
||||||
|
@ -1026,9 +1040,26 @@ static uint16_t igb_receive_assign(IGBCore *core, const struct eth_header *ehdr,
|
||||||
}
|
}
|
||||||
|
|
||||||
queues &= core->mac[VFRE];
|
queues &= core->mac[VFRE];
|
||||||
igb_rss_parse_packet(core, core->rx_pkt, external_tx != NULL, rss_info);
|
if (queues) {
|
||||||
if (rss_info->queue & 1) {
|
for (i = 0; i < IGB_NUM_VM_POOLS; i++) {
|
||||||
queues <<= 8;
|
if ((queues & BIT(i)) && igb_rx_is_oversized(core, i, size)) {
|
||||||
|
oversized |= BIT(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* 8.19.37 increment ROC if packet is oversized for all queues */
|
||||||
|
if (oversized == queues) {
|
||||||
|
trace_e1000x_rx_oversized(size);
|
||||||
|
e1000x_inc_reg_if_not_full(core->mac, ROC);
|
||||||
|
}
|
||||||
|
queues &= ~oversized;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (queues) {
|
||||||
|
igb_rss_parse_packet(core, core->rx_pkt,
|
||||||
|
external_tx != NULL, rss_info);
|
||||||
|
if (rss_info->queue & 1) {
|
||||||
|
queues <<= 8;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (net_rx_pkt_get_packet_type(core->rx_pkt)) {
|
switch (net_rx_pkt_get_packet_type(core->rx_pkt)) {
|
||||||
|
@ -1576,7 +1607,7 @@ igb_receive_internal(IGBCore *core, const struct iovec *iov, int iovcnt,
|
||||||
e1000x_vlan_enabled(core->mac),
|
e1000x_vlan_enabled(core->mac),
|
||||||
core->mac[VET] & 0xffff);
|
core->mac[VET] & 0xffff);
|
||||||
|
|
||||||
queues = igb_receive_assign(core, ehdr, &rss_info, external_tx);
|
queues = igb_receive_assign(core, ehdr, size, &rss_info, external_tx);
|
||||||
if (!queues) {
|
if (!queues) {
|
||||||
trace_e1000e_rx_flt_dropped();
|
trace_e1000e_rx_flt_dropped();
|
||||||
return orig_size;
|
return orig_size;
|
||||||
|
|
Loading…
Reference in New Issue