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; }
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); } }
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; }