04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China/*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * CDDL HEADER START
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * and limitations under the License.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * CDDL HEADER END
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China/*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Copyright 2007-2009 Myricom, Inc. All rights reserved.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Use is subject to license terms.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#ifndef lint
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinastatic const char __idstring[] =
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China "@(#)$Id: myri10ge_lro.c,v 1.7 2009-06-29 13:47:22 gallatin Exp $";
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#endif
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#include "myri10ge_var.h"
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#define IP_OFFMASK 0x1fff
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#define TCPOPT_TIMESTAMP 8
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#define TCPOLEN_TIMESTAMP 10
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China#define TCPOLEN_TSTAMP_APPA 12
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China/*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Assume len is a multiple of 4. Note that "raw" must be
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * suitably aligned. In practice, it will always enter algned on
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * at least a 4 bytes bounday, due to the alignment of our rx buffers.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinauint16_t
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinamyri10ge_csum_generic(uint16_t *raw, int len)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China{
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = 0;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China while (len > 0) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum += *raw;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China raw++;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum += *raw;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China raw++;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China len -= 4;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum >> 16) + (csum & 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum >> 16) + (csum & 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return ((uint16_t)csum);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China}
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinastatic uint16_t
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinamyri10ge_in_pseudo(unsigned int a, unsigned int b,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China unsigned int c)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China{
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint64_t csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (uint64_t)a + b + c;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum >> 16) + (csum & 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum >> 16) + (csum & 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return ((uint16_t)csum);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China}
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinavoid
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinamyri10ge_lro_flush(struct myri10ge_slice_state *ss, struct lro_entry *lro,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct myri10ge_mblk_list *mbl)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China{
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct ip *ip;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct tcphdr *tcp;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t *ts_ptr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t tcplen, tcp_csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (lro->append_cnt) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * incorporate the new len into the ip header and
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * re-calculate the checksum
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip = lro->ip;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip->ip_len = htons(lro->len - ETHERNET_HEADER_SIZE);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip->ip_sum = 0;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip->ip_sum = 0xffff ^
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China myri10ge_csum_generic((uint16_t *)ip, sizeof (*ip));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* incorporate the latest ack into the tcp header */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp = (struct tcphdr *)(ip + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_ack = lro->ack_seq;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_win = lro->window;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_flags = lro->flags;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* incorporate latest timestamp into the tcp header */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (lro->timestamp) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ts_ptr = (uint32_t *)(tcp + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ts_ptr[1] = htonl(lro->tsval);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ts_ptr[2] = lro->tsecr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * update checksum in tcp header by re-calculating the
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * tcp pseudoheader checksum, and adding it to the checksum
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * of the tcp payload data
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_sum = 0;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcplen = lro->len - sizeof (*ip) - ETHERNET_HEADER_SIZE;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_csum = lro->data_csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_csum += myri10ge_in_pseudo(ip->ip_src.s_addr,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip->ip_dst.s_addr, htons(tcplen + IPPROTO_TCP));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_csum += myri10ge_csum_generic((uint16_t *)tcp,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_off << 2);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_csum = (tcp_csum & 0xffff) + (tcp_csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_csum = (tcp_csum & 0xffff) + (tcp_csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp->th_sum = 0xffff ^ tcp_csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_hcksum_set(lro->m_head, 0, 0, 0,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer 0, HCK_IPV4_HDRCKSUM_OK | HCK_FULLCKSUM_OK);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China mbl->cnt += lro->append_cnt;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China myri10ge_mbl_append(ss, mbl, lro->m_head);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China MYRI10GE_SLICE_STAT_INC(lro_flushed);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China MYRI10GE_SLICE_STAT_ADD(lro_queued, lro->append_cnt + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->m_head = NULL;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->timestamp = 0;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->append_cnt = 0;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->next = ss->lro_free;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ss->lro_free = lro;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China}
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinaint
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing Chinamyri10ge_lro_rx(struct myri10ge_slice_state *ss, mblk_t *m_head,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t csum, struct myri10ge_mblk_list *mbl)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China{
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct ether_header *eh;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct ip *ip;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct tcphdr *tcp;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t *ts_ptr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China struct lro_entry *lro, *curr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China int hlen, ip_len, tcp_hdr_len, tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China int opt_bytes, trim;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China int tot_len = MBLKL(m_head);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t seq, tmp_csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China eh = (struct ether_header *)(void *)m_head->b_rptr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (eh->ether_type != htons(ETHERTYPE_IP))
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip = (struct ip *)(void *)(eh + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (ip->ip_p != IPPROTO_TCP)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* ensure there are no options */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if ((ip->ip_hl << 2) != sizeof (*ip))
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* .. and the packet is not fragmented */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (ip->ip_off & htons(IP_MF|IP_OFFMASK))
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* verify that the IP header checksum is correct */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = myri10ge_csum_generic((uint16_t *)ip, sizeof (*ip));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (unlikely((tmp_csum ^ 0xffff) != 0)) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China MYRI10GE_SLICE_STAT_INC(lro_bad_csum);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* find the TCP header */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp = (struct tcphdr *)(ip + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* ensure no bits set besides ack or psh */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if ((tcp->th_flags & ~(TH_ACK | TH_PUSH)) != 0)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * check for timestamps. Since the only option we handle are
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * timestamps, we only have to handle the simple case of
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * aligned timestamps
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China opt_bytes = (tcp->th_off << 2) - sizeof (*tcp);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_hdr_len = sizeof (*tcp) + opt_bytes;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ts_ptr = (uint32_t *)(tcp + 1);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (opt_bytes != 0) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (unlikely(opt_bytes != TCPOLEN_TSTAMP_APPA) ||
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China (*ts_ptr != ntohl(TCPOPT_NOP<<24|TCPOPT_NOP<<16|
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP)))
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip_len = ntohs(ip->ip_len);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_data_len = ip_len - (tcp->th_off << 2) - sizeof (*ip);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * If frame is padded beyond the end of the IP packet,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * then we must trim the extra bytes off the end.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China trim = tot_len - (ip_len + ETHERNET_HEADER_SIZE);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (trim != 0) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (trim < 0) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* truncated packet */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China m_head->b_wptr -= trim;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tot_len -= trim;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* Verify TCP checksum */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = ntohs((uint16_t)csum);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = csum + myri10ge_in_pseudo(ip->ip_src.s_addr,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ip->ip_dst.s_addr, htons(tcp_hdr_len + tcp_data_len + IPPROTO_TCP));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = (tmp_csum & 0xffff) + (tmp_csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = (tmp_csum & 0xffff) + (tmp_csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (tmp_csum != 0xffff) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China MYRI10GE_SLICE_STAT_INC(lro_bad_csum);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China hlen = ip_len + ETHERNET_HEADER_SIZE - tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China seq = ntohl(tcp->th_seq);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China for (lro = ss->lro_active; lro != NULL; lro = lro->next) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (lro->source_port == tcp->th_sport &&
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->dest_port == tcp->th_dport &&
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->source_ip == ip->ip_src.s_addr &&
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->dest_ip == ip->ip_dst.s_addr) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* Try to append it */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (unlikely(seq != lro->next_seq)) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* out of order packet */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (ss->lro_active == lro) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ss->lro_active = lro->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China } else {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr = ss->lro_active;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China while (curr->next != lro)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr = curr->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr->next = lro->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China myri10ge_lro_flush(ss, lro, mbl);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (EINVAL);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (opt_bytes) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China uint32_t tsval = ntohl(*(ts_ptr + 1));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* make sure timestamp values are increasing */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (unlikely(lro->tsval > tsval ||
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *(ts_ptr + 2) == 0)) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (-8);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->tsval = tsval;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->tsecr = *(ts_ptr + 2);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->next_seq += tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->ack_seq = tcp->th_ack;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->window = tcp->th_win;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->flags |= tcp->th_flags;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->append_cnt++;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (tcp_data_len == 0) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China freeb(m_head);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (0);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * subtract off the checksum of the tcp header
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * from the hardware checksum, and add it to
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * the stored tcp data checksum. Byteswap
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * the checksum if the total length so far is
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * odd
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = myri10ge_csum_generic((uint16_t *)tcp,
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tcp_hdr_len);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = csum + (tmp_csum ^ 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (lro->len & 0x1) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* Odd number of bytes so far, flip bytes */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = ((csum << 8) | (csum >> 8)) & 0xffff;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = csum + lro->data_csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->data_csum = csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->len += tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * adjust mblk so that rptr points to
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * the first byte of the payload
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China m_head->b_rptr += hlen;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* append mbuf chain */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->m_tail->b_cont = m_head;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* advance the last pointer */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->m_tail = m_head;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* flush packet if required */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (lro->len > (65535 - myri10ge_mtu) ||
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China (lro->append_cnt + 1) == myri10ge_lro_max_aggr) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (ss->lro_active == lro) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ss->lro_active = lro->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China } else {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr = ss->lro_active;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China while (curr->next != lro)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr = curr->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China curr->next = lro->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China myri10ge_lro_flush(ss, lro, mbl);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (0);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (ss->lro_free == NULL)
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (ENOMEM);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* start a new chain */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro = ss->lro_free;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ss->lro_free = lro->next;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->next = ss->lro_active;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China ss->lro_active = lro;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->source_port = tcp->th_sport;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->dest_port = tcp->th_dport;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->source_ip = ip->ip_src.s_addr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->dest_ip = ip->ip_dst.s_addr;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->next_seq = seq + tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->mss = (uint16_t)tcp_data_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->ack_seq = tcp->th_ack;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->window = tcp->th_win;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->flags = tcp->th_flags;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * save the checksum of just the TCP payload by
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * subtracting off the checksum of the TCP header from
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * the entire hardware checksum
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Since IP header checksum is correct, checksum over
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * the IP header is -0. Substracting -0 is unnecessary.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China tmp_csum = myri10ge_csum_generic((uint16_t *)tcp, tcp_hdr_len);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = csum + (tmp_csum ^ 0xffff);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China csum = (csum & 0xffff) + (csum >> 16);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->data_csum = csum;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->ip = ip;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China /* record timestamp if it is present */
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China if (opt_bytes) {
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->timestamp = 1;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->tsval = ntohl(*(ts_ptr + 1));
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->tsecr = *(ts_ptr + 2);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China }
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->len = tot_len;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->m_head = m_head;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China lro->m_tail = m_head;
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China return (0);
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China}
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China/*
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * This file uses MyriGE driver indentation.
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China *
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * Local Variables:
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * c-file-style:"sun"
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * tab-width:8
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China * End:
04b6cca3fef9f6205a9aa479c48d196116193dd9lucy wang - Sun Microsystems - Beijing China */