| 1409 | } |
| 1410 | |
| 1411 | void |
| 1412 | tcp_lro_queue_mbuf(struct lro_ctrl *lc, struct mbuf *mb) |
| 1413 | { |
| 1414 | struct timespec arrv; |
| 1415 | |
| 1416 | /* sanity checks */ |
| 1417 | if (__predict_false(lc->ifp == NULL || lc->lro_mbuf_data == NULL || |
| 1418 | lc->lro_mbuf_max == 0)) { |
| 1419 | /* packet drop */ |
| 1420 | m_freem(mb); |
| 1421 | return; |
| 1422 | } |
| 1423 | |
| 1424 | /* check if packet is not LRO capable */ |
| 1425 | if (__predict_false(mb->m_pkthdr.csum_flags == 0 || |
| 1426 | (lc->ifp->if_capenable & IFCAP_LRO) == 0)) { |
| 1427 | /* input packet to network layer */ |
| 1428 | (*lc->ifp->if_input) (lc->ifp, mb); |
| 1429 | return; |
| 1430 | } |
| 1431 | /* Arrival Stamp the packet */ |
| 1432 | |
| 1433 | if ((mb->m_flags & M_TSTMP) == 0) { |
| 1434 | /* If no hardware or arrival stamp on the packet add arrival */ |
| 1435 | nanouptime(&arrv); |
| 1436 | mb->m_pkthdr.rcv_tstmp = ((arrv.tv_sec * 1000000000) + |
| 1437 | arrv.tv_nsec); |
| 1438 | mb->m_flags |= M_TSTMP_LRO; |
| 1439 | } |
| 1440 | /* create sequence number */ |
| 1441 | lc->lro_mbuf_data[lc->lro_mbuf_count].seq = |
| 1442 | (((uint64_t)M_HASHTYPE_GET(mb)) << 56) | |
| 1443 | (((uint64_t)mb->m_pkthdr.flowid) << 24) | |
| 1444 | ((uint64_t)lc->lro_mbuf_count); |
| 1445 | |
| 1446 | /* enter mbuf */ |
| 1447 | lc->lro_mbuf_data[lc->lro_mbuf_count].mb = mb; |
| 1448 | |
| 1449 | /* flush if array is full */ |
| 1450 | if (__predict_false(++lc->lro_mbuf_count == lc->lro_mbuf_max)) |
| 1451 | tcp_lro_flush_all(lc); |
| 1452 | } |
| 1453 | |
| 1454 | /* end */ |
nothing calls this directly
no test coverage detected