diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2009-12-09 23:59:11 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2009-12-09 23:59:11 +0000 |
commit | bbaf959e9bd5a6ec8d3e7ebf382ced9cd03c3a88 (patch) | |
tree | 1256960c698b957692fd493f3545ce349e4d462d /contrib/fwd | |
parent | 2e9ac3b3420350737aa37d01c0418bede10ab401 (diff) |
contrib/fwd: properly handle rules with proto=tcpudp
Diffstat (limited to 'contrib/fwd')
-rw-r--r-- | contrib/fwd/src/fwd_config.c | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/contrib/fwd/src/fwd_config.c b/contrib/fwd/src/fwd_config.c index 1d16606d3..11fd45832 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 { |