diff options
Diffstat (limited to 'src/inet.c')
-rw-r--r-- | src/inet.c | 150 |
1 files changed, 90 insertions, 60 deletions
@@ -1,6 +1,8 @@ #include "inet.h" #include "endian.h" +#include <string.h> + void prne_netmask_from_cidr (uint8_t *out, size_t cidr) { size_t shft = 7; @@ -19,7 +21,7 @@ void prne_netmask_from_cidr (uint8_t *out, size_t cidr) { } uint16_t prne_calc_tcp_chksum4 ( - const struct iphdr *ih, + const prne_iphdr4_t *ih, const uint8_t *th, size_t th_len, const uint8_t *data, @@ -29,18 +31,17 @@ uint16_t prne_calc_tcp_chksum4 ( // pseudo sum += prne_recmb_msb16( - ((uint8_t*)&ih->saddr)[0], - ((uint8_t*)&ih->saddr)[1]); + ih->saddr[0], + ih->saddr[1]); sum += prne_recmb_msb16( - ((uint8_t*)&ih->saddr)[2], - ((uint8_t*)&ih->saddr)[3]); - + ih->saddr[2], + ih->saddr[3]); sum += prne_recmb_msb16( - ((uint8_t*)&ih->daddr)[0], - ((uint8_t*)&ih->daddr)[1]); + ih->daddr[0], + ih->daddr[1]); sum += prne_recmb_msb16( - ((uint8_t*)&ih->daddr)[2], - ((uint8_t*)&ih->daddr)[3]); + ih->daddr[2], + ih->daddr[3]); sum += 6; // IPPROTO_TCP sum += (uint16_t)(th_len + data_len); @@ -68,7 +69,7 @@ uint16_t prne_calc_tcp_chksum4 ( } uint16_t prne_calc_tcp_chksum6 ( - const struct ipv6hdr *ih, + const prne_iphdr6_t *ih, const uint8_t *th, size_t th_len, const uint8_t *data, @@ -78,55 +79,23 @@ uint16_t prne_calc_tcp_chksum6 ( const uint_fast32_t tcp_length = (uint32_t)(th_len + data_len); // pseudo - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[0], - ((const uint8_t*)&ih->saddr)[1]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[2], - ((const uint8_t*)&ih->saddr)[3]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[4], - ((const uint8_t*)&ih->saddr)[5]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[6], - ((const uint8_t*)&ih->saddr)[7]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[8], - ((const uint8_t*)&ih->saddr)[9]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[10], - ((const uint8_t*)&ih->saddr)[11]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[12], - ((const uint8_t*)&ih->saddr)[13]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->saddr)[14], - ((const uint8_t*)&ih->saddr)[15]); - - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[0], - ((const uint8_t*)&ih->daddr)[1]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[2], - ((const uint8_t*)&ih->daddr)[3]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[4], - ((const uint8_t*)&ih->daddr)[5]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[6], - ((const uint8_t*)&ih->daddr)[7]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[8], - ((const uint8_t*)&ih->daddr)[9]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[10], - ((const uint8_t*)&ih->daddr)[11]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[12], - ((const uint8_t*)&ih->daddr)[13]); - sum += prne_recmb_msb16( - ((const uint8_t*)&ih->daddr)[14], - ((const uint8_t*)&ih->daddr)[15]); + sum += prne_recmb_msb16(ih->saddr[0], ih->saddr[1]); + sum += prne_recmb_msb16(ih->saddr[2], ih->saddr[3]); + sum += prne_recmb_msb16(ih->saddr[4], ih->saddr[5]); + sum += prne_recmb_msb16(ih->saddr[6], ih->saddr[7]); + sum += prne_recmb_msb16(ih->saddr[8], ih->saddr[9]); + sum += prne_recmb_msb16(ih->saddr[10], ih->saddr[11]); + sum += prne_recmb_msb16(ih->saddr[12], ih->saddr[13]); + sum += prne_recmb_msb16(ih->saddr[14], ih->saddr[15]); + + sum += prne_recmb_msb16(ih->daddr[0], ih->daddr[1]); + sum += prne_recmb_msb16(ih->daddr[2], ih->daddr[3]); + sum += prne_recmb_msb16(ih->daddr[4], ih->daddr[5]); + sum += prne_recmb_msb16(ih->daddr[6], ih->daddr[7]); + sum += prne_recmb_msb16(ih->daddr[8], ih->daddr[9]); + sum += prne_recmb_msb16(ih->daddr[10], ih->daddr[11]); + sum += prne_recmb_msb16(ih->daddr[12], ih->daddr[13]); + sum += prne_recmb_msb16(ih->daddr[14], ih->daddr[15]); sum += (uint16_t)((tcp_length & 0xFFFF0000) >> 16); sum += (uint16_t)(tcp_length & 0xFFFF); @@ -154,3 +123,64 @@ uint16_t prne_calc_tcp_chksum6 ( return ~((sum & 0xFFFF) + (sum >> 16)); } + +void prne_ser_iphdr4 (uint8_t *mem, const prne_iphdr4_t *in) { + mem[0] = (4 << 4) | (in->ihl & 0x0F); + mem[1] = 0; + mem[2] = prne_getmsb16(in->total_len, 0); + mem[3] = prne_getmsb16(in->total_len, 1); + mem[4] = prne_getmsb16(in->id, 0); + mem[5] = prne_getmsb16(in->id, 1); + mem[6] = 0; + mem[7] = 0; + mem[8] = in->ttl; + mem[9] = in->protocol; + mem[10] = 0; + mem[11] = 0; + mem[12] = in->saddr[0]; + mem[13] = in->saddr[1]; + mem[14] = in->saddr[2]; + mem[15] = in->saddr[3]; + mem[16] = in->daddr[0]; + mem[17] = in->daddr[1]; + mem[18] = in->daddr[2]; + mem[19] = in->daddr[3]; +} + +void prne_ser_iphdr6 (uint8_t *mem, const prne_iphdr6_t *in) { + mem[0] = (6 << 4); + mem[1] = prne_getmsb32(in->flow_label, 1) & 0xF; + mem[2] = prne_getmsb32(in->flow_label, 2); + mem[3] = prne_getmsb32(in->flow_label, 3); + mem[4] = prne_getmsb16(in->payload_len, 0); + mem[5] = prne_getmsb16(in->payload_len, 1); + mem[6] = in->next_hdr; + mem[7] = in->hop_limit; + memcpy(mem + 8, in->saddr, 16); + memcpy(mem + 24, in->daddr, 16); +} + +void prne_dser_iphdr4 (const uint8_t *data, prne_iphdr4_t *out) { + out->ihl = data[0] & 0x0F; + out->total_len = prne_recmb_msb16(data[2], data[3]); + out->id = prne_recmb_msb16(data[4], data[5]); + out->ttl = data[8]; + out->protocol = data[9]; + out->saddr[0] = data[12]; + out->saddr[1] = data[13]; + out->saddr[2] = data[14]; + out->saddr[3] = data[15]; + out->daddr[0] = data[16]; + out->daddr[1] = data[17]; + out->daddr[2] = data[18]; + out->daddr[3] = data[19]; +} + +void prne_dser_iphdr6 (const uint8_t *data, prne_iphdr6_t *out) { + out->flow_label = prne_recmb_msb32(0, data[1] & 0x0F, data[2], data[3]); + out->payload_len = prne_recmb_msb16(data[4], data[5]); + out->next_hdr = data[6]; + out->hop_limit = data[7]; + memcpy(out->saddr, data + 8, 16); + memcpy(out->daddr, data + 24, 16); +} |