Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / Projects / Webserver / Lib / uip / uip-split.c
index a910ee6..5222a05 100644 (file)
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * 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 <adam@sics.se>
  *
  *
  * Author: Adam Dunkels <adam@sics.se>
  *
- * $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 <string.h>
-
 #include "uip-split.h"
 #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])
 
 
 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
 void
 uip_split_output(void)
 {
 void
 uip_split_output(void)
 {
+#if UIP_TCP
   u16_t tcplen, len1, len2;
 
   /* We only try to split maximum sized TCP segments. */
   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;
     /* 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. */
 
     /* 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 */
 #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 */
 #endif /* UIP_CONF_IPV6 */
-    
+
     /* Recalculate the TCP checksum. */
     BUF->tcpchksum = 0;
     BUF->tcpchksum = ~(uip_tcpchksum());
     /* 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 */
     BUF->ipchksum = 0;
     BUF->ipchksum = ~(uip_ipchksum());
 #endif /* UIP_CONF_IPV6 */
-    
+
     /* Transmit the first packet. */
     /* 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
 
     /* 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). */
        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 */
 #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 */
 #endif /* UIP_CONF_IPV6 */
-    
-    /*    uip_appdata += len1;*/
+
     memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2);
 
     uip_add32(BUF->seqno, 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];
     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());
     /* 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. */
 #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 */
 }
 }
+
 /*-----------------------------------------------------------------------------*/
 /*-----------------------------------------------------------------------------*/
+