aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2022-03-17 13:03:03 +0100
committerToni Uhlig <matzeton@googlemail.com>2022-03-17 13:03:03 +0100
commit147b51e37d82460a67d159756cccacfb64ef1405 (patch)
treec3b2665421eb337e186cf3626af88ec4177685ae
parent54fb5592b4724934535a606f1981ea439533a4a8 (diff)
second whatever
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r--src/Makefile.am3
-rw-r--r--src/pdesc.c9
-rw-r--r--src/pdesc.h13
-rw-r--r--src/ppkt.h14
-rw-r--r--src/psock.c75
-rw-r--r--src/psock.h12
-rw-r--r--src/ptunnel.c3
7 files changed, 117 insertions, 12 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 60b5bc6..411c410 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -40,7 +40,8 @@ endif
ptunnel_ng_SOURCES = \
ptunnel.c \
- psock.c
+ psock.c \
+ pdesc.c
if IS_WINDOWS
wpcap_DEF = $(srcdir)/win32/WPCAP.DEF
diff --git a/src/pdesc.c b/src/pdesc.c
new file mode 100644
index 0000000..c876df4
--- /dev/null
+++ b/src/pdesc.c
@@ -0,0 +1,9 @@
+#include "pdesc.h"
+#include "psock.h"
+
+enum pdesc_retval pdesc_find_remote(struct psock * psock)
+{
+ for (size_t
+
+ return PDESC_REMOTE_FOUND;
+}
diff --git a/src/pdesc.h b/src/pdesc.h
index fbd9c7c..8dde3cf 100644
--- a/src/pdesc.h
+++ b/src/pdesc.h
@@ -3,10 +3,23 @@
#include <stdint.h>
+
+struct psock;
+
struct pdesc
{
uint16_t identifier;
uint16_t sequence;
};
+enum pdesc_retval
+{
+ PDESC_REMOTE_NEW,
+ PDESC_REMOTE_INVALID,
+ PDESC_REMOTE_FOUND
+};
+
+
+enum pdesc_retval pdesc_find_remote(struct psock *);
+
#endif
diff --git a/src/ppkt.h b/src/ppkt.h
index 83cc78a..fc3c271 100644
--- a/src/ppkt.h
+++ b/src/ppkt.h
@@ -3,18 +3,22 @@
#include <stdint.h>
-#define PPKT_TYPE_DATA 0x0001u
+
+#define PTUNNEL_IDENT 0xdeadc0de
+
+struct psock;
struct ppkt
{
+ uint32_t ident;
uint16_t type;
uint16_t data_size;
- uint32_t sequence;
uint8_t data[0];
-};
+} __attribute__((__packed__));
+
-void ppkt_header_prepare(struct ppkt *);
+void ppkt_header_prepare(struct psock *);
-void ppkt_header_process(struct ppkt *);
+void ppkt_header_process(struct psock *);
#endif
diff --git a/src/psock.c b/src/psock.c
index ca6f95d..8e1cbc3 100644
--- a/src/psock.c
+++ b/src/psock.c
@@ -11,7 +11,7 @@
#include <unistd.h>
-int psock_init(struct psock * psock, size_t max_descriptors)
+int psock_init(struct psock * psock, size_t max_descriptors, size_t packet_buffer_size)
{
struct epoll_event ev;
@@ -36,9 +36,21 @@ int psock_init(struct psock * psock, size_t max_descriptors)
goto error;
}
+ psock->packet.max = packet_buffer_size;
+ psock->packet.used = 0;
+ psock->packet.buffer = (uint8_t *)calloc(packet_buffer_size, sizeof(*psock->packet.buffer));
+ if (psock->packet.buffer == NULL)
+ {
+ goto error;
+ }
+
psock->remotes.max = max_descriptors;
psock->remotes.used = 0;
- psock->remotes.descriptors = (struct pdesc **)calloc(max_descriptors, sizeof(**psock->remotes.descriptors));
+ psock->remotes.descriptors = (struct pdesc *)calloc(max_descriptors, sizeof(*psock->remotes.descriptors));
+ if (psock->remotes.descriptors == NULL)
+ {
+ goto error;
+ }
return 0;
error:
@@ -64,9 +76,66 @@ void psock_free(struct psock * psock)
psock->epoll_fd = -1;
}
+static int psock_recvmsg(struct psock * psock)
+{
+ struct sockaddr_storage peer;
+ struct iovec iov;
+ struct msghdr hdr = {};
+ ssize_t nread;
+
+ iov.iov_base = (void *)psock->packet.buffer;
+ iov.iov_len = psock->packet.max;
+
+ hdr.msg_name = &peer;
+ hdr.msg_namelen = sizeof(peer);
+ hdr.msg_iov = &iov;
+ hdr.msg_iovlen = 1;
+
+ do {
+ nread = recvmsg(psock->icmp_fd, &hdr, 0);
+ } while (nread == -1 && errno == EINTR);
+
+ if (nread >= 0)
+ {
+ psock->packet.used = nread;
+
+ struct cmsghdr *cmsg = CMSG_FIRSTHDR(&hdr);
+ while (cmsg != NULL)
+ {
+ printf("CMSG TYPE/LEVEL/LEN: %d / %d / %zu\n", cmsg->cmsg_type, cmsg->cmsg_level, cmsg->cmsg_len);
+
+ cmsg = CMSG_NXTHDR(&hdr, cmsg);
+ }
+
+ return 0;
+ } else {
+ psock->packet.used = 0;
+ return -1;
+ }
+}
+
+static int psock_sendmsg(struct psock * psock)
+{
+ return -1;
+}
+
static void psock_handle_events(struct psock * psock)
{
- printf("!!!!!!\n");
+ if (psock_recvmsg(psock) == 0)
+ {
+ switch (pdesc_find_remote(psock))
+ {
+ case PDESC_REMOTE_NEW:
+ fprintf(stderr, "Remote NEW.\n");
+ break;
+ case PDESC_REMOTE_INVALID:
+ fprintf(stderr, "Remote INVALID\n");
+ break;
+ case PDESC_REMOTE_FOUND:
+ fprintf(stderr, "Remote FOUND\n");
+ break;
+ }
+ }
}
void psock_loop(struct psock * psock)
diff --git a/src/psock.h b/src/psock.h
index 6f564de..5faf24b 100644
--- a/src/psock.h
+++ b/src/psock.h
@@ -1,6 +1,7 @@
#ifndef PSOCK_H
#define PSOCK_H 1
+#include <stdint.h>
#include <stdlib.h>
@@ -10,15 +11,22 @@ struct psock
{
int epoll_fd;
int icmp_fd;
+
+ struct {
+ size_t used;
+ size_t max;
+ uint8_t * buffer;
+ } packet;
+
struct {
size_t used;
size_t max;
- struct pdesc ** descriptors;
+ struct pdesc * descriptors;
} remotes;
};
-int psock_init(struct psock *, size_t);
+int psock_init(struct psock *, size_t, size_t);
void psock_free(struct psock *);
diff --git a/src/ptunnel.c b/src/ptunnel.c
index d0f5823..df10db9 100644
--- a/src/ptunnel.c
+++ b/src/ptunnel.c
@@ -1,3 +1,4 @@
+#include "pdesc.h"
#include "psock.h"
#include <stdio.h>
@@ -8,7 +9,7 @@ int main(void)
{
struct psock psock = {};
- if (psock_init(&psock, 16) != 0)
+ if (psock_init(&psock, 16, 2048) != 0)
{
return 1;
}