Index: /branches/rel_apv_10_7_0/usr/src/sys/click/net/click_ether.c
===================================================================
--- /branches/rel_apv_10_7_0/usr/src/sys/click/net/click_ether.c	(revision 38372)
+++ /branches/rel_apv_10_7_0/usr/src/sys/click/net/click_ether.c	(working copy)
@@ -2418,6 +2418,15 @@
 	if(isipv6) {
 		ret = is_clicktcp6_packet(m, ifp, &ip_p, &l4_hdr);
 	} else {
+            iph = mtod(m, struct ip *);
+            if (iph->ip_off & htons(IP_MF | IP_OFFMASK)) {
+                /* XXXGL: shouldn't we save & set m_flags? */
+                m = ip_reass(m);
+                if (m == NULL)
+                    return;
+                m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED | CSUM_IP_VALID;
+                m->m_pkthdr.csum_data = 0xffff;
+            }
 		ret = is_clicktcp_packet(&m, ifp, &ip_p, &l4_hdr);
 	}
 
Index: /branches/rel_apv_10_7_0/usr/src/sys/click/netinet/click_input.c
===================================================================
--- /branches/rel_apv_10_7_0/usr/src/sys/click/netinet/click_input.c	(revision 38372)
+++ /branches/rel_apv_10_7_0/usr/src/sys/click/netinet/click_input.c	(working copy)
@@ -18481,7 +18481,7 @@
 				int mtu = ifp->if_mtu;
 				ip = mtod(m, struct ip *);
 				struct mbuf *mp = NULL;
-				if (ip->ip_p == IPPROTO_UDP && ntohs(ip->ip_len) > mtu) {
+				if ((ip->ip_p == IPPROTO_UDP || ip->ip_p == IPPROTO_TCP) && ntohs(ip->ip_len) > mtu) {
 					/*hardware checksum may work abormal for UDP if IP fragment happened*/
 					clickudp_udp_cksum_sw(m, ifp);
 
