aboutsummaryrefslogtreecommitdiff
path: root/src/inet.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/inet.c')
-rw-r--r--src/inet.c150
1 files changed, 90 insertions, 60 deletions
diff --git a/src/inet.c b/src/inet.c
index 5f7fb7d..bf73e2a 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -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);
+}