Exemple #1
0
bool unpack_hdr(uint8_t *buf, size_t size, struct hdr *hdr)
{
	UNPACKLE32(hdr->magic);
	UNPACKN(&hdr->cmd, sizeof(hdr->cmd));
	UNPACKLE32(hdr->payload_size);
	UNPACKLE32(hdr->cksum);

	if (hdr->magic != (uint32_t)HDR_MAGIC) {
		printf("unpack_hdr: wrong magic number\n");
		return false;
	}

	if (hdr->payload_size != size) {
		printf("unpack_hdr: wrong payload size\n");
		return false;
	}

	uint32_t cksum;
	if (hdr->payload_size == 0) {
		cksum = PAYLOADLESS_MSG_CKSUM;
	} else {
		cksum = msg_cksum(buf, hdr->payload_size);
	}
	if (hdr->cksum != cksum) {
		printf("unpack_hdr: payload checksum is invalid, %08x but should be %08x\n", hdr->cksum, cksum);
		return false;
	}

	return true;
}
Exemple #2
0
void tcplib_send_out(struct split_ip_msg *msg, struct tcp_hdr *tcph) {
  uint8_t buf[8192];
  struct timespec tv;
  if (sock <= 0) return;

  // printf("sending message\n");

  memcpy(msg->hdr.ip6_src.s6_addr, iface_addr, 16);
  msg->hdr.ip6_src.s6_addr[15] = 2;
  msg->hdr.hlim = 64;

  memset(msg->hdr.vlfc, 0, 4);
  msg->hdr.vlfc[0] = 6 << 4;

  tcph->chksum = htons(msg_cksum(msg, IANA_TCP));
  
  tv.tv_sec = 0;
  // sleep for a ms to give up the cpu...
  tv.tv_nsec = 1000000;
  nanosleep(&tv);

  // print_split_msg(msg);
  if (rand() % LOSS_RATE_TRANS == 0) {
    printf("dropping packet on write\n");
  } else {
    printf("tun_write\n");
    tun_write(sock, msg);
  }
}
Exemple #3
0
size_t pack_header(uint8_t *buf, size_t size, const char *cmd, const void *payload, size_t payload_size)
{
	size_t len;
	size_t off;
	uint32_t cksum;

	len = off = 0;

	PACKLE32(HDR_MAGIC);
	strncpy((char *)buf + 4, cmd, 12);
	size_t cmd_len = strlen(cmd);
	if (cmd_len < 12) {
		memset(buf + 4 + cmd_len, 0, 12 - cmd_len);
	}
	len += 12;
	off += 12;
	PACKLE32(payload_size);
	cksum = msg_cksum(payload, payload_size);
	PACKLE32(cksum);

	return HDR_SIZE;
}