diff options
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/pdesc.c | 9 | ||||
-rw-r--r-- | src/pdesc.h | 13 | ||||
-rw-r--r-- | src/ppkt.h | 14 | ||||
-rw-r--r-- | src/psock.c | 75 | ||||
-rw-r--r-- | src/psock.h | 12 | ||||
-rw-r--r-- | src/ptunnel.c | 3 |
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 @@ -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; } |