summaryrefslogtreecommitdiff
path: root/tests/conntrackd/cthelper/proto.c
diff options
context:
space:
mode:
authorGaurav Sinha <gaurav.sinha@vyatta.com>2012-05-30 07:54:05 -0700
committerGaurav Sinha <gaurav.sinha@vyatta.com>2012-05-30 07:54:05 -0700
commita608049a22dc23676c85bbf443e45cbbf0e9b83c (patch)
tree1b82fa315337a8503390384c2684fdbb27b58294 /tests/conntrackd/cthelper/proto.c
parent775fea07517af4b68cb2ce75e25ee5af09af0f05 (diff)
parent687fc04ea8de73eb1ec19d933c8d81f054c977dd (diff)
downloadconntrack-tools-a608049a22dc23676c85bbf443e45cbbf0e9b83c.tar.gz
conntrack-tools-a608049a22dc23676c85bbf443e45cbbf0e9b83c.zip
Merge branch 'cthelper9' of git://git.netfilter.org/conntrack-tools into user_space_helpers
Conflicts: .gitignore src/run.c
Diffstat (limited to 'tests/conntrackd/cthelper/proto.c')
-rwxr-xr-xtests/conntrackd/cthelper/proto.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/conntrackd/cthelper/proto.c b/tests/conntrackd/cthelper/proto.c
new file mode 100755
index 0000000..6a1f345
--- /dev/null
+++ b/tests/conntrackd/cthelper/proto.c
@@ -0,0 +1,49 @@
+#include <stdlib.h>
+#include <netinet/in.h>
+#include <linux/if_ether.h>
+
+#include "linux_list.h"
+#include "proto.h"
+
+static LIST_HEAD(l2l3_helper_list);
+static LIST_HEAD(l4_helper_list);
+
+struct cthelper_proto_l2l3_helper *
+cthelper_proto_l2l3_helper_find(const uint8_t *pkt,
+ unsigned int *l4protonum,
+ unsigned int *l3hdr_len)
+{
+ const struct ethhdr *eh = (const struct ethhdr *)pkt;
+ struct cthelper_proto_l2l3_helper *cur;
+
+ list_for_each_entry(cur, &l2l3_helper_list, head) {
+ if (ntohs(cur->l2protonum) == eh->h_proto) {
+ *l4protonum = cur->l4pkt_proto(pkt + ETH_HLEN);
+ *l3hdr_len = cur->l3pkt_hdr_len(pkt + ETH_HLEN);
+ return cur;
+ }
+ }
+ return NULL;
+}
+
+void cthelper_proto_l2l3_helper_register(struct cthelper_proto_l2l3_helper *h)
+{
+ list_add(&h->head, &l2l3_helper_list);
+}
+
+struct cthelper_proto_l4_helper *
+cthelper_proto_l4_helper_find(const uint8_t *pkt, unsigned int l4protocol)
+{
+ struct cthelper_proto_l4_helper *cur;
+
+ list_for_each_entry(cur, &l4_helper_list, head) {
+ if (cur->l4protonum == l4protocol)
+ return cur;
+ }
+ return NULL;
+}
+
+void cthelper_proto_l4_helper_register(struct cthelper_proto_l4_helper *h)
+{
+ list_add(&h->head, &l4_helper_list);
+}