uint8_t xtcpip_output(uip_lladdr_t *lladdr, chanend mac_tx) { /* * If L3 dest is multicast, build L2 multicast address * as per RFC 2464 section 7 * else fill with the addrsess in argument */ if(lladdr == NULL) { /* the dest must be multicast */ (&BUF->dest)->addr[0] = 0x33; (&BUF->dest)->addr[1] = 0x33; (&BUF->dest)->addr[2] = UIP_TCP_BUF->destipaddr.u8[12]; (&BUF->dest)->addr[3] = UIP_TCP_BUF->destipaddr.u8[13]; (&BUF->dest)->addr[4] = UIP_TCP_BUF->destipaddr.u8[14]; (&BUF->dest)->addr[5] = UIP_TCP_BUF->destipaddr.u8[15]; } else { memcpy(&BUF->dest, lladdr, UIP_LLADDR_LEN); } memcpy(&BUF->src, &uip_lladdr, UIP_LLADDR_LEN); BUF->type = UIP_HTONS(UIP_ETHTYPE_IPV6); uip_len += sizeof(struct uip_eth_hdr); xcoredev_send(mac_tx); return 0; }
static void uip_split_output_send(chanend mac_tx) { /* Recalculate the TCP checksum. */ BUF->tcpchksum = 0; BUF->tcpchksum = ~(uip_tcpchksum()); #if !UIP_CONF_IPV6 /* Recalculate the IP checksum. */ BUF->ipchksum = 0; BUF->ipchksum = ~(uip_ipchksum()); #endif uip_len += UIP_LLH_LEN; /* Transmit the first packet. */ xcoredev_send(mac_tx); }
/*-----------------------------------------------------------------------------*/ void uip_split_output(chanend mac_tx) { u16_t tcplen, len1, len2; /* We only try to split maximum sized TCP segments. */ if(BUF->proto == UIP_PROTO_TCP && uip_len + UIP_TCPIP_HLEN > UIP_BUFSIZE/2) { // printstr("split"); 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; if(len1 + len2 < tcplen) { ++len2; } /* 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; #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; #endif /* UIP_CONF_IPV6 */ /* Recalculate the TCP checksum. */ BUF->tcpchksum = 0; BUF->tcpchksum = ~(uip_tcpchksum()); #if !UIP_CONF_IPV6 /* Recalculate the IP checksum. */ BUF->ipchksum = 0; BUF->ipchksum = ~(uip_ipchksum()); #endif /* UIP_CONF_IPV6 */ uip_len += UIP_LLH_LEN; /* Transmit the first packet. */ /* uip_fw_output();*/ /* tcpip_output(); */ xcoredev_send(mac_tx); /* 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 packet (len1). */ uip_len = len2 + UIP_TCPIP_HLEN; #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; #endif /* UIP_CONF_IPV6 */ /* uip_appdata += len1;*/ memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2); uip_add32(BUF->seqno, len1); BUF->seqno[0] = uip_acc32[0]; 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()); #if !UIP_CONF_IPV6 /* Recalculate the IP checksum. */ BUF->ipchksum = 0; BUF->ipchksum = ~(uip_ipchksum()); #endif /* UIP_CONF_IPV6 */ /* Transmit the second packet. */ /* uip_fw_output();*/ /*tcpip_output();*/ uip_len += UIP_LLH_LEN; xcoredev_send(mac_tx); } else {