X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/15c408ab8635fe45226abc2c55c9bebfe1ccb6c8..77a9df36a77d2523dd2bc24fa17f9f04c6c175c5:/Projects/Webserver/Lib/uip/uip-split.c?ds=inline diff --git a/Projects/Webserver/Lib/uip/uip-split.c b/Projects/Webserver/Lib/uip/uip-split.c index a910ee621..5222a05b6 100644 --- a/Projects/Webserver/Lib/uip/uip-split.c +++ b/Projects/Webserver/Lib/uip/uip-split.c @@ -26,20 +26,14 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * This file is part of the uIP TCP/IP stack + * This file is part of the Contiki operating system. * * Author: Adam Dunkels * - * $Id: uip-split.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + * $Id: uip-split.c,v 1.2 2008/10/14 13:39:12 julienabeille Exp $ */ -#include - #include "uip-split.h" -#include "uip.h" -#include "uip-fw.h" -#include "uip_arch.h" - #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) @@ -48,13 +42,13 @@ void uip_split_output(void) { +#if UIP_TCP u16_t tcplen, len1, len2; /* We only try to split maximum sized TCP segments. */ - if(BUF->proto == UIP_PROTO_TCP && - uip_len == UIP_BUFSIZE - UIP_LLH_LEN) { + if(BUF->proto == UIP_PROTO_TCP && uip_len == UIP_BUFSIZE) { - tcplen = uip_len - UIP_TCPIP_HLEN; + tcplen = uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN; /* Split the segment in two. If the original packet length was odd, we make the second packet one byte larger. */ len1 = len2 = tcplen / 2; @@ -64,17 +58,17 @@ uip_split_output(void) /* Create the first packet. This is done by altering the length field of the IP header and updating the checksums. */ - uip_len = len1 + UIP_TCPIP_HLEN; + uip_len = len1 + UIP_TCPIP_HLEN + UIP_LLH_LEN; #if UIP_CONF_IPV6 /* For IPv6, the IP length field does not include the IPv6 IP header length. */ BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); #else /* UIP_CONF_IPV6 */ - BUF->len[0] = uip_len >> 8; - BUF->len[1] = uip_len & 0xff; + BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8; + BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff; #endif /* UIP_CONF_IPV6 */ - + /* Recalculate the TCP checksum. */ BUF->tcpchksum = 0; BUF->tcpchksum = ~(uip_tcpchksum()); @@ -84,28 +78,33 @@ uip_split_output(void) BUF->ipchksum = 0; BUF->ipchksum = ~(uip_ipchksum()); #endif /* UIP_CONF_IPV6 */ - + /* Transmit the first packet. */ - /* uip_fw_output();*/ - tcpip_output(); +#if UIP_CONF_IPV6 + tcpip_ipv6_output(); +#else + if (USB_CurrentMode == USB_MODE_Device) + RNDIS_Device_SendPacket(&Ethernet_RNDIS_Interface_Device, uip_buf, uip_len); + else + RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface_Host, uip_buf, uip_len); +#endif /* UIP_CONF_IPV6 */ /* Now, create the second packet. To do this, it is not enough to just alter the length field, but we must also update the TCP sequence number and point the uip_appdata to a new place in - memory. This place is detemined by the length of the first + memory. This place is determined by the length of the first packet (len1). */ - uip_len = len2 + UIP_TCPIP_HLEN; + uip_len = len2 + UIP_TCPIP_HLEN + UIP_LLH_LEN; #if UIP_CONF_IPV6 /* For IPv6, the IP length field does not include the IPv6 IP header length. */ BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); #else /* UIP_CONF_IPV6 */ - BUF->len[0] = uip_len >> 8; - BUF->len[1] = uip_len & 0xff; + BUF->len[0] = (uip_len - UIP_LLH_LEN) >> 8; + BUF->len[1] = (uip_len - UIP_LLH_LEN) & 0xff; #endif /* UIP_CONF_IPV6 */ - - /* uip_appdata += len1;*/ + memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2); uip_add32(BUF->seqno, len1); @@ -113,7 +112,7 @@ uip_split_output(void) BUF->seqno[1] = uip_acc32[1]; BUF->seqno[2] = uip_acc32[2]; BUF->seqno[3] = uip_acc32[3]; - + /* Recalculate the TCP checksum. */ BUF->tcpchksum = 0; BUF->tcpchksum = ~(uip_tcpchksum()); @@ -125,12 +124,28 @@ uip_split_output(void) #endif /* UIP_CONF_IPV6 */ /* Transmit the second packet. */ - /* uip_fw_output();*/ - tcpip_output(); - } else { - /* uip_fw_output();*/ - tcpip_output(); +#if UIP_CONF_IPV6 + tcpip_ipv6_output(); +#else + if (USB_CurrentMode == USB_MODE_Device) + RNDIS_Device_SendPacket(&Ethernet_RNDIS_Interface_Device, uip_buf, uip_len); + else + RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface_Host, uip_buf, uip_len); +#endif /* UIP_CONF_IPV6 */ + return; } - +#endif /* UIP_TCP */ + + /* uip_fw_output();*/ +#if UIP_CONF_IPV6 + tcpip_ipv6_output(); +#else + if (USB_CurrentMode == USB_MODE_Device) + RNDIS_Device_SendPacket(&Ethernet_RNDIS_Interface_Device, uip_buf, uip_len); + else + RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface_Host, uip_buf, uip_len); +#endif /* UIP_CONF_IPV6 */ } + /*-----------------------------------------------------------------------------*/ +