Lines Matching defs:le
86 static void tcp_lro_flush(struct lro_ctrl *lc, struct lro_entry *le);
92 int (*tcp_lro_flush_tcphpts)(struct lro_ctrl *lc, struct lro_entry *le);
152 struct lro_entry *le)
155 LIST_INSERT_HEAD(&lc->lro_active, le, next);
156 LIST_INSERT_HEAD(bucket, le, hash_next);
160 tcp_lro_active_remove(struct lro_entry *le)
163 LIST_REMOVE(le, next); /* active list */
164 LIST_REMOVE(le, hash_next); /* hash bucket */
177 struct lro_entry *le;
203 (lro_entries * sizeof(*le));
214 le = (struct lro_entry *)
219 LIST_INSERT_HEAD(&lc->lro_free, le + i, next);
494 struct lro_entry *le;
501 while ((le = LIST_FIRST(&lc->lro_active)) != NULL) {
502 tcp_lro_active_remove(le);
503 lro_free_mbuf_chain(le->m_head);
588 struct lro_entry *le;
590 while ((le = LIST_FIRST(&lc->lro_active)) != NULL) {
591 tcp_lro_active_remove(le);
592 tcp_lro_flush(lc, le);
599 struct lro_entry *le, *le_tmp;
602 * Walk through the list of le entries, and
611 LIST_FOREACH_SAFE(le, &lc->lro_active, next, le_tmp) {
612 if (le->m_head != NULL) {
613 tcp_lro_active_remove(le);
614 tcp_lro_flush(lc, le);
622 struct lro_entry *le, *le_tmp;
634 LIST_FOREACH_SAFE(le, &lc->lro_active, next, le_tmp) {
635 if (now >= (bintime2ns(&le->alloc_time) + tov)) {
636 tcp_lro_active_remove(le);
637 tcp_lro_flush(lc, le);
678 tcp_lro_update_checksum(const struct lro_parser *pa, const struct lro_entry *le,
731 pa->tcp->th_ack = le->ack_seq;
732 pa->tcp->th_win = le->window;
735 if (le->timestamp != 0) {
739 ts_ptr[1] = htonl(le->tsval);
740 ts_ptr[2] = le->tsecr;
790 tcp_flush_out_entry(struct lro_ctrl *lc, struct lro_entry *le)
793 if (le->needs_merge) {
796 switch (le->inner.data.lro_type) {
798 csum = tcp_lro_update_checksum(&le->inner, le,
799 le->m_head->m_pkthdr.lro_tcp_d_len,
800 le->m_head->m_pkthdr.lro_tcp_d_csum);
801 csum = tcp_lro_update_checksum(&le->outer, NULL,
802 le->m_head->m_pkthdr.lro_tcp_d_len +
803 le->inner.total_hdr_len, csum);
804 le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID |
806 le->m_head->m_pkthdr.csum_data = 0xffff;
807 if (__predict_false(le->outer.data.lro_flags & LRO_FLAG_DECRYPTED))
808 le->m_head->m_pkthdr.csum_flags |= CSUM_TLS_DECRYPTED;
811 csum = tcp_lro_update_checksum(&le->inner, le,
812 le->m_head->m_pkthdr.lro_tcp_d_len,
813 le->m_head->m_pkthdr.lro_tcp_d_csum);
814 csum = tcp_lro_update_checksum(&le->outer, NULL,
815 le->m_head->m_pkthdr.lro_tcp_d_len +
816 le->inner.total_hdr_len, csum);
817 le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID |
819 le->m_head->m_pkthdr.csum_data = 0xffff;
820 if (__predict_false(le->outer.data.lro_flags & LRO_FLAG_DECRYPTED))
821 le->m_head->m_pkthdr.csum_flags |= CSUM_TLS_DECRYPTED;
824 switch (le->outer.data.lro_type) {
826 csum = tcp_lro_update_checksum(&le->outer, le,
827 le->m_head->m_pkthdr.lro_tcp_d_len,
828 le->m_head->m_pkthdr.lro_tcp_d_csum);
829 le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID |
831 le->m_head->m_pkthdr.csum_data = 0xffff;
832 if (__predict_false(le->outer.data.lro_flags & LRO_FLAG_DECRYPTED))
833 le->m_head->m_pkthdr.csum_flags |= CSUM_TLS_DECRYPTED;
836 csum = tcp_lro_update_checksum(&le->outer, le,
837 le->m_head->m_pkthdr.lro_tcp_d_len,
838 le->m_head->m_pkthdr.lro_tcp_d_csum);
839 le->m_head->m_pkthdr.csum_flags = CSUM_DATA_VALID |
841 le->m_head->m_pkthdr.csum_data = 0xffff;
842 if (__predict_false(le->outer.data.lro_flags & LRO_FLAG_DECRYPTED))
843 le->m_head->m_pkthdr.csum_flags |= CSUM_TLS_DECRYPTED;
859 le->m_head->m_nextpkt = NULL;
860 lc->lro_queued += le->m_head->m_pkthdr.lro_nsegs;
861 (*lc->ifp->if_input)(lc->ifp, le->m_head);
865 tcp_set_entry_to_mbuf(struct lro_ctrl *lc, struct lro_entry *le,
881 le->timestamp = 0;
883 le->timestamp = 1;
884 le->tsval = ntohl(*(ts_ptr + 1));
885 le->tsecr = *(ts_ptr + 2);
891 le->next_seq = ntohl(th->th_seq) + tcp_data_len;
892 le->ack_seq = th->th_ack;
893 le->window = th->th_win;
894 le->flags = tcp_get_flags(th);
895 le->needs_merge = 0;
898 le->m_head = m;
899 le->m_tail = m_last(m);
903 tcp_push_and_replace(struct lro_ctrl *lc, struct lro_entry *le, struct mbuf *m)
914 msave = le->m_head->m_nextpkt;
915 le->m_head->m_nextpkt = NULL;
918 tcp_flush_out_entry(lc, le);
921 pa = tcp_lro_parser(m, &le->outer, &le->inner, false);
930 tcp_set_entry_to_mbuf(lc, le, m, pa->tcp);
937 tcp_lro_mbuf_append_pkthdr(struct lro_entry *le, const struct mbuf *p)
942 m = le->m_head;
959 le->needs_merge = 1;
963 tcp_lro_condense(struct lro_ctrl *lc, struct lro_entry *le)
985 m = le->m_head->m_nextpkt;
1002 le->m_head->m_nextpkt = m->m_nextpkt;
1003 tcp_push_and_replace(lc, le, m);
1011 le->m_head->m_nextpkt = m->m_nextpkt;
1012 tcp_push_and_replace(lc, le, m);
1015 while((m = le->m_head->m_nextpkt) != NULL) {
1017 * condense m into le, first
1020 le->m_head->m_nextpkt = m->m_nextpkt;
1028 tcp_data_len_total = le->m_head->m_pkthdr.lro_tcp_d_len + tcp_data_len;
1029 tcp_data_seg_total = le->m_head->m_pkthdr.lro_nsegs + m->m_pkthdr.lro_nsegs;
1034 tcp_push_and_replace(lc, le, m);
1043 * current le. We will go up to the beginning
1047 tcp_push_and_replace(lc, le, m);
1051 tcp_push_and_replace(lc, le, m);
1057 if (TSTMP_GT(le->tsval, tsval)) {
1058 tcp_push_and_replace(lc, le, m);
1061 le->tsval = tsval;
1062 le->tsecr = *(ts_ptr + 2);
1065 if (__predict_false(ntohl(th->th_seq) != le->next_seq ||
1067 (le->flags & TH_ACK)) ||
1069 le->ack_seq == th->th_ack &&
1070 le->window == th->th_win))) {
1072 tcp_push_and_replace(lc, le, m);
1076 SEQ_GT(ntohl(th->th_ack), ntohl(le->ack_seq))) {
1077 le->next_seq += tcp_data_len;
1078 le->ack_seq = th->th_ack;
1079 le->window = th->th_win;
1080 le->needs_merge = 1;
1081 } else if (th->th_ack == le->ack_seq) {
1082 if (WIN_GT(th->th_win, le->window)) {
1083 le->window = th->th_win;
1084 le->needs_merge = 1;
1094 tcp_lro_mbuf_append_pkthdr(le, m);
1103 le->m_tail->m_next = m;
1104 le->m_tail = m_last(m);
1109 tcp_lro_flush(struct lro_ctrl *lc, struct lro_entry *le)
1115 tcp_lro_flush_tcphpts(lc, le) != 0) {
1116 tcp_lro_condense(lc, le);
1117 tcp_flush_out_entry(lc, le);
1120 bzero(le, sizeof(*le));
1121 LIST_INSERT_HEAD(&lc->lro_free, le, next);
1285 struct lro_entry *le;
1382 LIST_FOREACH(le, bucket, hash_next) {
1384 if (lro_address_compare(&po.data, &le->outer.data) == false ||
1385 lro_address_compare(&pi.data, &le->inner.data) == false)
1390 SEQ_LT(ntohl(th->th_ack), ntohl(le->ack_seq))) {
1396 le->m_last_mbuf->m_nextpkt = m;
1398 le->m_last_mbuf = m;
1407 le = LIST_FIRST(&lc->lro_free);
1408 LIST_REMOVE(le, next);
1409 tcp_lro_active_insert(lc, bucket, le);
1412 le->inner = pi;
1413 le->outer = po;
1416 le->alloc_time = lc->lro_last_queue_time;
1418 tcp_set_entry_to_mbuf(lc, le, m, th);
1421 le->m_last_mbuf = m;