aboutsummaryrefslogtreecommitdiff
path: root/src/ppkt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ppkt.c')
-rw-r--r--src/ppkt.c40
1 files changed, 34 insertions, 6 deletions
diff --git a/src/ppkt.c b/src/ppkt.c
index 5121b01..8557592 100644
--- a/src/ppkt.c
+++ b/src/ppkt.c
@@ -1,6 +1,7 @@
#include "pdesc.h"
#include "ppkt.h"
#include "psock.h"
+#include "putils.h"
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
@@ -68,7 +69,7 @@ int ppkt_process_ppkt(struct psock * sock)
return 0;
}
-static size_t ppkt_prepare_ppkt(struct ppkt * pkt, enum ptype type, size_t additional_size)
+static size_t ppkt_sizeof_pkt(struct ppkt * pkt, enum ptype type, size_t additional_size)
{
size_t subpkt_size;
@@ -91,16 +92,41 @@ static size_t ppkt_prepare_ppkt(struct ppkt * pkt, enum ptype type, size_t addit
return sizeof(*pkt) + subpkt_size + additional_size;
}
-void ppkt_prepare_auth_request(struct ppkt_buffer * const pkt_buf, uint8_t * const hash, size_t hash_siz)
+static size_t ppkt_init_pkt(struct pdesc const * desc,
+ struct ppkt_buffer * pkt_buf,
+ enum ptype type,
+ size_t additional_size)
{
- size_t total_size = ppkt_prepare_ppkt(&pkt_buf->pkt, PTYPE_AUTH_REQUEST, hash_siz);
+ pkt_buf->icmphdr.un.echo.id = desc->identifier;
+ switch (type) {
+ case PTYPE_INVALID:
+ pkt_buf->icmphdr.type = 3; // Destination Unreachable
+ break;
+ case PTYPE_AUTH_REQUEST:
+ pkt_buf->icmphdr.type = 8; // Echo Request
+ break;
+ case PTYPE_AUTH_RESPONSE:
+ pkt_buf->icmphdr.type = 0; // Echo Reply
+ break;
+ }
+ pkt_buf->icmphdr.code = 0;
+
+ return ppkt_sizeof_pkt(&pkt_buf->pkt, type, additional_size);
+}
+
+static void ppkt_finalize_pkt(struct ppkt_buffer * const pkt_buf)
+{
+ pkt_buf->icmphdr.checksum = 0;
+ pkt_buf->icmphdr.checksum = icmp_checksum_iovec(pkt_buf->iovec, pkt_buf->iovec_used);
+}
+
+void ppkt_prepare_auth_request(struct pdesc * desc, struct ppkt_buffer * pkt_buf, uint8_t * hash, size_t hash_siz)
+{
+ size_t total_size = ppkt_init_pkt(desc, pkt_buf, PTYPE_AUTH_REQUEST, hash_siz);
pkt_buf->auth_request.magic = htonl(PTUNNEL_MAGIC);
pkt_buf->auth_request.hash_siz = hash_siz;
- pkt_buf->icmphdr.type = 8;
- pkt_buf->icmphdr.code = 0;
-
pkt_buf->iovec[0].iov_base = &pkt_buf->icmphdr;
pkt_buf->iovec[0].iov_len = sizeof(pkt_buf->icmphdr);
@@ -114,4 +140,6 @@ void ppkt_prepare_auth_request(struct ppkt_buffer * const pkt_buf, uint8_t * con
pkt_buf->iovec[3].iov_len = hash_siz;
pkt_buf->iovec_used = 4;
+
+ ppkt_finalize_pkt(pkt_buf);
}