diff options
author | Ting-Wei Lan <lantw44@gmail.com> | 2014-06-15 03:37:37 +0800 |
---|---|---|
committer | Ting-Wei Lan <lantw44@gmail.com> | 2014-06-15 03:37:37 +0800 |
commit | 20feaf8719052e602409ab12f2c270a08aca994c (patch) | |
tree | cfddc02c94fa1bf5af08231f6ef0768ad08a287c | |
parent | b3824f12e976c84eeac0a4de42d4a150c1d2950f (diff) | |
download | fastalg-protocol-20feaf8719052e602409ab12f2c270a08aca994c.tar.gz fastalg-protocol-20feaf8719052e602409ab12f2c270a08aca994c.tar.zst fastalg-protocol-20feaf8719052e602409ab12f2c270a08aca994c.zip |
Change a packet buffer to a list to handle multiple packetsv0.1.2
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | falgproto/falgproto-protocol-dns.c | 20 | ||||
-rw-r--r-- | falgproto/falgproto.h | 23 |
3 files changed, 30 insertions, 15 deletions
diff --git a/configure.ac b/configure.ac index de5e469..9642360 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. # vim: set sw=4 ts=4 sts=4 et: -AC_INIT([fastalg-protocol], [0.1.1], [BUG-REPORT-ADDRESS]) +AC_INIT([fastalg-protocol], [0.1.2], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([falgproto/falgproto.c]) AC_CONFIG_HEADERS([config.h]) diff --git a/falgproto/falgproto-protocol-dns.c b/falgproto/falgproto-protocol-dns.c index b0eb014..097ab61 100644 --- a/falgproto/falgproto-protocol-dns.c +++ b/falgproto/falgproto-protocol-dns.c @@ -92,17 +92,22 @@ static inline ssize_t get_question_name ( return out_len; } +/* We only handle the first packet now, as it is not possible for the + * the question to exceed the 512 bytes limit. */ FALGPROTO_PARAM_GETTER_DECL (dns) { + char *payload = pkt->payload; + size_t len = pkt->len; + uint16_t question_count; - if (get_question_count (pkt, len, &question_count) < 0) { + if (get_question_count (payload, len, &question_count) < 0) { return (FalgprotoParam) { .result = FALGPROTO_PARAM_RESULT_TRUNCATED }; } if (question_count == 0) { return (FalgprotoParam) { .result = FALGPROTO_PARAM_RESULT_NOT_FOUND }; } - ssize_t question_name_len = get_question_name (pkt, len, NULL); + ssize_t question_name_len = get_question_name (payload, len, NULL); if (question_name_len < 0) { return (FalgprotoParam) { .result = FALGPROTO_PARAM_RESULT_TRUNCATED }; } @@ -112,7 +117,7 @@ FALGPROTO_PARAM_GETTER_DECL (dns) { return (FalgprotoParam) { .result = FALGPROTO_PARAM_RESULT_ERROR }; } - get_question_name (pkt, len, question_name); + get_question_name (payload, len, question_name); return (FalgprotoParam) { .param = question_name, .len = question_name_len, @@ -122,8 +127,11 @@ FALGPROTO_PARAM_GETTER_DECL (dns) { FALGPROTO_PRINTER_DECL (dns) { + char *payload = pkt->payload; + size_t len = pkt->len; + uint16_t question_count; - if (get_question_count (pkt, len, &question_count) < 0) { + if (get_question_count (payload, len, &question_count) < 0) { fputs ("DNS: Cannot get question count\n", fp); return; } @@ -134,14 +142,14 @@ FALGPROTO_PRINTER_DECL (dns) { return; } - ssize_t question_name_len = get_question_name (pkt, len, NULL); + ssize_t question_name_len = get_question_name (payload, len, NULL); if (question_name_len < 0) { fputs ("DNS: Malformed question name\n", fp); return; } char question_name[question_name_len + 1]; - get_question_name (pkt, len, question_name); + get_question_name (payload, len, question_name); fputs ("DNS: Question name: ", fp); fputs (question_name, fp); fputc ('\n', fp); diff --git a/falgproto/falgproto.h b/falgproto/falgproto.h index adf8fee..cf9d57e 100644 --- a/falgproto/falgproto.h +++ b/falgproto/falgproto.h @@ -20,11 +20,18 @@ typedef enum falgproto_transport { FALGPROTO_TRANSPORT_UDP } FalgprotoTransport; +typedef struct falgproto_packet { + struct falgproto_packet* next; + void* data; /* unused (may be used by caller to store data) */ + char* payload; /* packet payload */ + size_t len; /* packet payload length */ +} FalgprotoPacket; + typedef struct falgproto_param { - char* param; - size_t len; - bool dup; - int result; + char* param; /* parameter (may not be NULL-terminated) */ + size_t len; /* parameter length */ + bool dup; /* whether the parameter is malloc()-ed */ + int result; /* error code listed below */ } FalgprotoParam; #define FALGPROTO_PARAM_RESULT_ERROR -1 @@ -32,17 +39,17 @@ typedef struct falgproto_param { #define FALGPROTO_PARAM_RESULT_NOT_FOUND 1 #define FALGPROTO_PARAM_RESULT_TRUNCATED 2 -typedef FalgprotoParam (*FalgprotoParamGetter) (const char *pkt, size_t len); -typedef void (*FalgprotoPrinter) (FILE *fp, const char *pkt, size_t len); +typedef FalgprotoParam (*FalgprotoParamGetter) (FalgprotoPacket *pkt); +typedef void (*FalgprotoPrinter) (FILE *fp, FalgprotoPacket *pkt); typedef bool (*FalgprotoMatcher) ( const char *big, size_t big_len, const char *little, size_t little_len); #define FALGPROTO_PARAM_GETTER_NAME(type) falgproto_##type##_param_getter #define FALGPROTO_PARAM_GETTER_DECL(type) \ - FalgprotoParam FALGPROTO_PARAM_GETTER_NAME(type)(const char *pkt, size_t len) + FalgprotoParam FALGPROTO_PARAM_GETTER_NAME(type)(FalgprotoPacket *pkt) #define FALGPROTO_PRINTER_NAME(type) falgproto_##type##_printer #define FALGPROTO_PRINTER_DECL(type) \ - void FALGPROTO_PRINTER_NAME(type)(FILE *fp, const char *pkt, size_t len) + void FALGPROTO_PRINTER_NAME(type)(FILE *fp, FalgprotoPacket *pkt) #define FALGPROTO_MATCHER_NAME(type) falgproto_##type##_matcher #define FALGPROTO_MATCHER_DECL(type) \ bool FALGPROTO_MATCHER_NAME(type) \ |