Lines Matching refs:lro_desc
56 int len, const struct net_lro_desc *lro_desc) in lro_tcp_ip_check() argument
90 if (lro_desc && after(ntohl(lro_desc->tcp_rcv_tsval), in lro_tcp_ip_check()
103 static void lro_update_tcp_ip_header(struct net_lro_desc *lro_desc) in lro_update_tcp_ip_header() argument
105 struct iphdr *iph = lro_desc->iph; in lro_update_tcp_ip_header()
106 struct tcphdr *tcph = lro_desc->tcph; in lro_update_tcp_ip_header()
110 tcph->ack_seq = lro_desc->tcp_ack; in lro_update_tcp_ip_header()
111 tcph->window = lro_desc->tcp_window; in lro_update_tcp_ip_header()
113 if (lro_desc->tcp_saw_tstamp) { in lro_update_tcp_ip_header()
115 *(p+2) = lro_desc->tcp_rcv_tsecr; in lro_update_tcp_ip_header()
118 csum_replace2(&iph->check, iph->tot_len, htons(lro_desc->ip_tot_len)); in lro_update_tcp_ip_header()
119 iph->tot_len = htons(lro_desc->ip_tot_len); in lro_update_tcp_ip_header()
123 lro_desc->data_csum = csum_add(lro_desc->data_csum, tcp_hdr_csum); in lro_update_tcp_ip_header()
125 lro_desc->ip_tot_len - in lro_update_tcp_ip_header()
127 lro_desc->data_csum); in lro_update_tcp_ip_header()
147 static void lro_init_desc(struct net_lro_desc *lro_desc, struct sk_buff *skb, in lro_init_desc() argument
155 lro_desc->parent = skb; in lro_init_desc()
156 lro_desc->next_frag = &(skb_shinfo(skb)->frags[nr_frags]); in lro_init_desc()
157 lro_desc->iph = iph; in lro_init_desc()
158 lro_desc->tcph = tcph; in lro_init_desc()
159 lro_desc->tcp_next_seq = ntohl(tcph->seq) + tcp_data_len; in lro_init_desc()
160 lro_desc->tcp_ack = tcph->ack_seq; in lro_init_desc()
161 lro_desc->tcp_window = tcph->window; in lro_init_desc()
163 lro_desc->pkt_aggr_cnt = 1; in lro_init_desc()
164 lro_desc->ip_tot_len = ntohs(iph->tot_len); in lro_init_desc()
168 lro_desc->tcp_saw_tstamp = 1; in lro_init_desc()
169 lro_desc->tcp_rcv_tsval = *(ptr+1); in lro_init_desc()
170 lro_desc->tcp_rcv_tsecr = *(ptr+2); in lro_init_desc()
173 lro_desc->mss = tcp_data_len; in lro_init_desc()
174 lro_desc->active = 1; in lro_init_desc()
176 lro_desc->data_csum = lro_tcp_data_csum(iph, tcph, in lro_init_desc()
180 static inline void lro_clear_desc(struct net_lro_desc *lro_desc) in lro_clear_desc() argument
182 memset(lro_desc, 0, sizeof(struct net_lro_desc)); in lro_clear_desc()
185 static void lro_add_common(struct net_lro_desc *lro_desc, struct iphdr *iph, in lro_add_common() argument
188 struct sk_buff *parent = lro_desc->parent; in lro_add_common()
191 lro_desc->pkt_aggr_cnt++; in lro_add_common()
192 lro_desc->ip_tot_len += tcp_data_len; in lro_add_common()
193 lro_desc->tcp_next_seq += tcp_data_len; in lro_add_common()
194 lro_desc->tcp_window = tcph->window; in lro_add_common()
195 lro_desc->tcp_ack = tcph->ack_seq; in lro_add_common()
198 if (lro_desc->tcp_saw_tstamp) { in lro_add_common()
200 lro_desc->tcp_rcv_tsecr = *(topt + 2); in lro_add_common()
203 lro_desc->data_csum = csum_block_add(lro_desc->data_csum, in lro_add_common()
210 if (tcp_data_len > lro_desc->mss) in lro_add_common()
211 lro_desc->mss = tcp_data_len; in lro_add_common()
214 static void lro_add_packet(struct net_lro_desc *lro_desc, struct sk_buff *skb, in lro_add_packet() argument
217 struct sk_buff *parent = lro_desc->parent; in lro_add_packet()
220 lro_add_common(lro_desc, iph, tcph, tcp_data_len); in lro_add_packet()
225 if (lro_desc->last_skb) in lro_add_packet()
226 lro_desc->last_skb->next = skb; in lro_add_packet()
230 lro_desc->last_skb = skb; in lro_add_packet()
234 static int lro_check_tcp_conn(struct net_lro_desc *lro_desc, in lro_check_tcp_conn() argument
238 if ((lro_desc->iph->saddr != iph->saddr) || in lro_check_tcp_conn()
239 (lro_desc->iph->daddr != iph->daddr) || in lro_check_tcp_conn()
240 (lro_desc->tcph->source != tcph->source) || in lro_check_tcp_conn()
241 (lro_desc->tcph->dest != tcph->dest)) in lro_check_tcp_conn()
251 struct net_lro_desc *lro_desc = NULL; in lro_get_desc() local
260 lro_desc = tmp; in lro_get_desc()
267 lro_desc = &lro_arr[i]; in lro_get_desc()
274 return lro_desc; in lro_get_desc()
278 struct net_lro_desc *lro_desc) in lro_flush() argument
280 if (lro_desc->pkt_aggr_cnt > 1) in lro_flush()
281 lro_update_tcp_ip_header(lro_desc); in lro_flush()
283 skb_shinfo(lro_desc->parent)->gso_size = lro_desc->mss; in lro_flush()
286 netif_receive_skb(lro_desc->parent); in lro_flush()
288 netif_rx(lro_desc->parent); in lro_flush()
291 lro_clear_desc(lro_desc); in lro_flush()
297 struct net_lro_desc *lro_desc; in __lro_proc_skb() local
311 lro_desc = lro_get_desc(lro_mgr, lro_mgr->lro_arr, iph, tcph); in __lro_proc_skb()
312 if (!lro_desc) in __lro_proc_skb()
319 if (!lro_desc->active) { /* start new lro session */ in __lro_proc_skb()
324 lro_init_desc(lro_desc, skb, iph, tcph); in __lro_proc_skb()
329 if (lro_desc->tcp_next_seq != ntohl(tcph->seq)) in __lro_proc_skb()
332 if (lro_tcp_ip_check(iph, tcph, skb->len, lro_desc)) in __lro_proc_skb()
335 lro_add_packet(lro_desc, skb, iph, tcph); in __lro_proc_skb()
338 if ((lro_desc->pkt_aggr_cnt >= lro_mgr->max_aggr) || in __lro_proc_skb()
339 lro_desc->parent->len > (0xFFFF - lro_mgr->dev->mtu)) in __lro_proc_skb()
340 lro_flush(lro_mgr, lro_desc); in __lro_proc_skb()
345 lro_flush(lro_mgr, lro_desc); in __lro_proc_skb()
367 struct net_lro_desc *lro_desc = lro_mgr->lro_arr; in lro_flush_all() local
370 if (lro_desc[i].active) in lro_flush_all()
371 lro_flush(lro_mgr, &lro_desc[i]); in lro_flush_all()