summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTing-Wei Lan <lantw44@gmail.com>2014-06-15 03:37:37 +0800
committerTing-Wei Lan <lantw44@gmail.com>2014-06-15 03:37:37 +0800
commit20feaf8719052e602409ab12f2c270a08aca994c (patch)
treecfddc02c94fa1bf5af08231f6ef0768ad08a287c
parentb3824f12e976c84eeac0a4de42d4a150c1d2950f (diff)
downloadfastalg-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.ac2
-rw-r--r--falgproto/falgproto-protocol-dns.c20
-rw-r--r--falgproto/falgproto.h23
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) \