From 1eae7cf16756c085cdf51e6b0513937e6ccb51df Mon Sep 17 00:00:00 2001 From: darkcoven Date: Mon, 1 Apr 2013 23:11:51 +0200 Subject: [PATCH] Added basic packet dumper. --- .gitignore | 2 +- Makefile | 5 +++ dump/Makefile | 34 +++++++++++++++++++++ dump/dump.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 dump/Makefile create mode 100644 dump/dump.c diff --git a/.gitignore b/.gitignore index 5619528..4d33834 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,7 @@ *.so *.a admin -admind +ngdump lib/doc/ raw/doc/ brouillon diff --git a/Makefile b/Makefile index 8af2203..dacd00d 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,9 @@ cli: lib force @+$(MAKE) -C cli +dump: raw force + @+$(MAKE) -C dump + force: @true @@ -29,10 +32,12 @@ clean: @+$(MAKE) -C raw clean @+$(MAKE) -C lib clean @+$(MAKE) -C cli clean + @+$(MAKE) -C dump clean mrproper: clean @+$(MAKE) -C raw mrproper @+$(MAKE) -C lib mrproper @+$(MAKE) -C cli mrproper + @+$(MAKE) -C dump mrproper diff --git a/dump/Makefile b/dump/Makefile new file mode 100644 index 0000000..9d347c1 --- /dev/null +++ b/dump/Makefile @@ -0,0 +1,34 @@ + +CC=gcc +CFLAGS=-I../raw/include/ -W -Wall -Wextra -Os +LDFLAGS=-L../raw -lrawnsdp +EXEC=ngdump + +SRC=$(wildcard *.c) +OBJ=$(SRC:.c=.o) + + +ifeq ($(DEBUG), yes) +CFLAGS+=-g +LDFLAGS+=-g +else +CFLAGS+=-fomit-frame-pointer +LDFLAGS+=-s +endif + + +$(EXEC): $(OBJ) + $(CC) $^ -o $@ $(LDFLAGS) + +%.o: %.c + $(CC) -c $^ -o $@ $(CFLAGS) + + +clean: + @rm -f *.o + +mrproper: clean + @rm -f $(EXEC) + + + diff --git a/dump/dump.c b/dump/dump.c new file mode 100644 index 0000000..d57fc82 --- /dev/null +++ b/dump/dump.c @@ -0,0 +1,85 @@ + +#include +#include +#include + +#include +#include + + +int main (void) +{ + char buffer[1500]; + struct ng_packet np; + int err = 0, s, len; + struct sockaddr_in local, remote; + socklen_t slen = sizeof(struct sockaddr_in); + unsigned char error; + unsigned short attr_error; + List *attr; + ListNode *ln; + struct attr *at; + + + s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (s < 0) { + perror("socket"); + err = 1; + goto end; + }; + + + memset(&local, 0, sizeof(struct sockaddr_in)); + local.sin_family = AF_INET; + local.sin_addr.s_addr = htonl(INADDR_ANY); + local.sin_port = htons(SWITCH_PORT); + + if (bind(s, (struct sockaddr*)&local, sizeof(struct sockaddr_in)) < 0) { + perror("bind"); + err = 2; + goto end; + } + + while (1) { + + len = recvfrom(s, buffer, sizeof(buffer), 0, (struct sockaddr*)&remote, &slen); + if (len < 0) { + perror("recvfrom"); + err = 3; + goto end; + } + + printf("---------------------------------\n"); + + np.buffer = buffer; + np.maxlen = len; + initNgPacket(&np); + + attr = createEmptyList(); + + if (ntohs(remote.sin_port) != CLIENT_PORT || + len < (int)sizeof(struct ng_header) || + !validateNgHeader(np.nh, 0, NULL, NULL, 0) || + extractPacketAttributes(&np, &error, &attr_error, attr, ATTR_END, 0) < 0) { + printf("wrong packet\n"); + goto end; + } + + printf("received %d attribute(s)\n", attr->count); + + for (ln = attr->first; ln != NULL; ln = ln->next) { + at = ln->data; + printf("received attribute code = %04X, length = %d\n", at->attr, at->size); + } + + destroyList(attr, (void(*)(void*))freeAttr); + + printf("---------------------------------\n\n"); + } + + close(s); + +end: + return err; +} + -- 2.39.2