|
@@ -772,6 +772,7 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index)
|
|
|
netio_pkt_t *pkt = (netio_pkt_t *)((unsigned long) &qsp[1] + index);
|
|
|
|
|
|
netio_pkt_metadata_t *metadata = NETIO_PKT_METADATA(pkt);
|
|
|
+ netio_pkt_status_t pkt_status = NETIO_PKT_STATUS_M(metadata, pkt);
|
|
|
|
|
|
/* Extract the packet size. FIXME: Shouldn't the second line */
|
|
|
/* get subtracted? Mostly moot, since it should be "zero". */
|
|
@@ -804,40 +805,25 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index)
|
|
|
#endif /* TILE_NET_DUMP_PACKETS */
|
|
|
|
|
|
#ifdef TILE_NET_VERIFY_INGRESS
|
|
|
- if (!NETIO_PKT_L4_CSUM_CORRECT_M(metadata, pkt) &&
|
|
|
- NETIO_PKT_L4_CSUM_CALCULATED_M(metadata, pkt)) {
|
|
|
- /* Bug 6624: Includes UDP packets with a "zero" checksum. */
|
|
|
- pr_warning("Bad L4 checksum on %d byte packet.\n", len);
|
|
|
- }
|
|
|
- if (!NETIO_PKT_L3_CSUM_CORRECT_M(metadata, pkt) &&
|
|
|
- NETIO_PKT_L3_CSUM_CALCULATED_M(metadata, pkt)) {
|
|
|
+ if (pkt_status == NETIO_PKT_STATUS_OVERSIZE && len >= 64) {
|
|
|
dump_packet(buf, len, "rx");
|
|
|
- panic("Bad L3 checksum.");
|
|
|
- }
|
|
|
- switch (NETIO_PKT_STATUS_M(metadata, pkt)) {
|
|
|
- case NETIO_PKT_STATUS_OVERSIZE:
|
|
|
- if (len >= 64) {
|
|
|
- dump_packet(buf, len, "rx");
|
|
|
- panic("Unexpected OVERSIZE.");
|
|
|
- }
|
|
|
- break;
|
|
|
- case NETIO_PKT_STATUS_BAD:
|
|
|
- pr_warning("Unexpected BAD %ld byte packet.\n", len);
|
|
|
+ panic("Unexpected OVERSIZE.");
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
filter = 0;
|
|
|
|
|
|
- /* ISSUE: Filter TCP packets with "bad" checksums? */
|
|
|
-
|
|
|
- if (!(dev->flags & IFF_UP)) {
|
|
|
+ if (pkt_status == NETIO_PKT_STATUS_BAD) {
|
|
|
+ /* Handle CRC error and hardware truncation. */
|
|
|
+ filter = 2;
|
|
|
+ } else if (!(dev->flags & IFF_UP)) {
|
|
|
/* Filter packets received before we're up. */
|
|
|
filter = 1;
|
|
|
- } else if (NETIO_PKT_STATUS_M(metadata, pkt) == NETIO_PKT_STATUS_BAD) {
|
|
|
+ } else if (NETIO_PKT_ETHERTYPE_RECOGNIZED_M(metadata, pkt) &&
|
|
|
+ pkt_status == NETIO_PKT_STATUS_UNDERSIZE) {
|
|
|
/* Filter "truncated" packets. */
|
|
|
- filter = 1;
|
|
|
+ filter = 2;
|
|
|
} else if (!(dev->flags & IFF_PROMISC)) {
|
|
|
- /* FIXME: Implement HW multicast filter. */
|
|
|
if (!is_multicast_ether_addr(buf)) {
|
|
|
/* Filter packets not for our address. */
|
|
|
const u8 *mine = dev->dev_addr;
|
|
@@ -847,9 +833,12 @@ static bool tile_net_poll_aux(struct tile_net_cpu *info, int index)
|
|
|
|
|
|
u64_stats_update_begin(&stats->syncp);
|
|
|
|
|
|
- if (filter) {
|
|
|
+ if (filter != 0) {
|
|
|
|
|
|
- /* ISSUE: Update "drop" statistics? */
|
|
|
+ if (filter == 1)
|
|
|
+ stats->rx_dropped++;
|
|
|
+ else
|
|
|
+ stats->rx_errors++;
|
|
|
|
|
|
tile_net_provide_linux_buffer(info, va, small);
|
|
|
|