summaryrefslogtreecommitdiffhomepage
path: root/contrib/fwd/src/fwd_config.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2009-12-09 23:59:11 +0000
committerJo-Philipp Wich <jow@openwrt.org>2009-12-09 23:59:11 +0000
commitbbaf959e9bd5a6ec8d3e7ebf382ced9cd03c3a88 (patch)
tree1256960c698b957692fd493f3545ce349e4d462d /contrib/fwd/src/fwd_config.c
parent2e9ac3b3420350737aa37d01c0418bede10ab401 (diff)
contrib/fwd: properly handle rules with proto=tcpudp
Diffstat (limited to 'contrib/fwd/src/fwd_config.c')
-rw-r--r--contrib/fwd/src/fwd_config.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/contrib/fwd/src/fwd_config.c b/contrib/fwd/src/fwd_config.c
index 1d16606d36..11fd458325 100644
--- a/contrib/fwd/src/fwd_config.c
+++ b/contrib/fwd/src/fwd_config.c
@@ -523,6 +523,7 @@ static void fwd_read_redirects_cb(
) {
const char *src;
struct fwd_data *dtn = NULL;
+ struct fwd_data *dtn2 = NULL;
struct fwd_zone *zsrc = NULL;
/* check zone */
@@ -561,6 +562,31 @@ static void fwd_read_redirects_cb(
dtn->type = FWD_S_REDIRECT;
dtn->next = cv->cursor;
cv->cursor = dtn;
+
+ if( (proto != NULL) && (proto->type == FWD_PR_TCPUDP) )
+ {
+ if( !(dtn2 = fwd_alloc_ptr(struct fwd_data)) ||
+ !(dtn2->section.redirect.proto = fwd_alloc_ptr(struct fwd_proto))
+ ) {
+ fwd_free_ptr(dtn2);
+ fwd_read_error("out of memory while parsing config!");
+ }
+
+ dtn->section.redirect.proto->type = FWD_PR_UDP;
+ dtn2->section.redirect.proto->type = FWD_PR_TCP;
+
+ dtn2->section.redirect.src = zsrc;
+ dtn2->section.redirect.src_ip = src_ip;
+ dtn2->section.redirect.src_mac = src_mac;
+ dtn2->section.redirect.src_port = src_port;
+ dtn2->section.redirect.src_dport = src_dport;
+ dtn2->section.redirect.dest_ip = dest_ip;
+ dtn2->section.redirect.dest_port = dest_port;
+
+ dtn2->type = FWD_S_REDIRECT;
+ dtn2->next = cv->cursor;
+ cv->cursor = dtn2;
+ }
}
else
{
@@ -592,6 +618,7 @@ static void fwd_read_rules_cb(
) {
const char *src, *dest;
struct fwd_data *dtn = NULL;
+ struct fwd_data *dtn2 = NULL;
struct fwd_zone *zsrc = NULL;
struct fwd_zone *zdest = NULL;
@@ -640,6 +667,32 @@ static void fwd_read_rules_cb(
dtn->type = FWD_S_RULE;
dtn->next = cv->cursor;
cv->cursor = dtn;
+
+ if( (proto != NULL) && (proto->type == FWD_PR_TCPUDP) )
+ {
+ if( !(dtn2 = fwd_alloc_ptr(struct fwd_data)) ||
+ !(dtn2->section.rule.proto = fwd_alloc_ptr(struct fwd_proto))
+ ) {
+ fwd_free_ptr(dtn2);
+ fwd_read_error("out of memory while parsing config!");
+ }
+
+ dtn->section.rule.proto->type = FWD_PR_UDP;
+ dtn2->section.rule.proto->type = FWD_PR_TCP;
+
+ dtn2->section.rule.src = zsrc;
+ dtn2->section.rule.src_ip = src_ip;
+ dtn2->section.rule.src_mac = src_mac;
+ dtn2->section.rule.src_port = src_port;
+ dtn2->section.rule.dest = zdest;
+ dtn2->section.rule.dest_ip = dest_ip;
+ dtn2->section.rule.dest_port = dest_port;
+ dtn2->section.rule.target = dtn->section.rule.target;
+
+ dtn2->type = FWD_S_RULE;
+ dtn2->next = cv->cursor;
+ cv->cursor = dtn2;
+ }
}
else
{