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);
}
Exemple #3
0
/*-----------------------------------------------------------------------------*/
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 {