summaryrefslogtreecommitdiffhomepage
path: root/contrib/fwd
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/fwd')
-rw-r--r--contrib/fwd/src/fwd_config.c59
-rw-r--r--contrib/fwd/src/fwd_config.h2
2 files changed, 50 insertions, 11 deletions
diff --git a/contrib/fwd/src/fwd_config.c b/contrib/fwd/src/fwd_config.c
index a77965cf5a..def36d139c 100644
--- a/contrib/fwd/src/fwd_config.c
+++ b/contrib/fwd/src/fwd_config.c
@@ -20,6 +20,7 @@
#include "fwd.h"
#include "fwd_addr.h"
#include "fwd_config.h"
+#include "fwd_utils.h"
#include "ucix.h"
@@ -395,11 +396,11 @@ fwd_read_defaults(struct uci_context *uci)
* config zone
*/
static void fwd_read_zone_networks_cb(
- const char *net, struct fwd_network_list **np
+ const char *net, struct fwd_network **np
) {
- struct fwd_network_list *nn;
+ struct fwd_network *nn;
- if( (nn = fwd_alloc_ptr(struct fwd_network_list)) != NULL )
+ if( (nn = fwd_alloc_ptr(struct fwd_network)) != NULL )
{
nn->name = strdup(net);
nn->next = *np;
@@ -412,7 +413,7 @@ static void fwd_read_zones_cb(
const char *s, struct fwd_data_conveyor *cv
) {
struct fwd_data *dtn;
- struct fwd_network_list *net = NULL;
+ struct fwd_network *net = NULL;
const char *name;
if( !(name = fwd_read_string(uci, s, "name")) )
@@ -775,9 +776,9 @@ fwd_read_includes(struct uci_context *uci)
* config interface
*/
static void fwd_read_network_data(
- struct uci_context *uci, struct fwd_network_list *net
+ struct uci_context *uci, struct fwd_network *net
) {
- struct fwd_network_list *e;
+ struct fwd_network *e;
const char *type, *ifname;
for( e = net; e; e = e->next )
@@ -806,9 +807,9 @@ static void fwd_read_networks(
fwd_read_network_data(uci, e->section.zone.networks);
}
-static void fwd_free_networks(struct fwd_network_list *h)
+static void fwd_free_networks(struct fwd_network *h)
{
- struct fwd_network_list *e = h;
+ struct fwd_network *e = h;
while( h != NULL )
{
@@ -825,12 +826,33 @@ static void fwd_free_networks(struct fwd_network_list *h)
e = h = NULL;
}
+static struct fwd_cidr * fwd_alloc_cidr(struct fwd_cidr *addr)
+{
+ struct fwd_cidr *cidr;
+
+ if( (cidr = fwd_alloc_ptr(struct fwd_cidr)) != NULL )
+ {
+ if( addr != NULL )
+ {
+ cidr->addr.s_addr = addr->addr.s_addr;
+ cidr->prefix = addr->prefix;
+ }
+
+ return cidr;
+ }
+
+ return NULL;
+}
+
-struct fwd_data * fwd_read_config(void)
+struct fwd_data * fwd_read_config(struct fwd_handle *h)
{
struct uci_context *ctx;
- struct fwd_data *defaults, *zones;
+ struct fwd_data *defaults, *zones, *e;
+ struct fwd_addr *addrs;
+ struct fwd_network *net;
+ struct fwd_zone *zone;
if( (ctx = ucix_init("firewall")) != NULL )
{
@@ -853,6 +875,23 @@ struct fwd_data * fwd_read_config(void)
fwd_read_networks(ctx, zones);
ucix_cleanup(ctx);
+ if( !(addrs = fwd_get_addrs(h->rtnl_socket, AF_INET)) )
+ goto error;
+
+ for( e = zones; e && (zone = &e->section.zone); e = e->next )
+ {
+ if( e->type != FWD_S_ZONE )
+ break;
+
+ for( net = zone->networks; net; net = net->next )
+ {
+ net->addr = fwd_alloc_cidr(
+ fwd_lookup_addr(addrs, net->ifname)
+ );
+ }
+ }
+
+ fwd_free_addrs(addrs);
return defaults;
}
}
diff --git a/contrib/fwd/src/fwd_config.h b/contrib/fwd/src/fwd_config.h
index ba66dffea7..058cff4734 100644
--- a/contrib/fwd/src/fwd_config.h
+++ b/contrib/fwd/src/fwd_config.h
@@ -21,7 +21,7 @@ struct fwd_data_conveyor {
};
/* api */
-struct fwd_data * fwd_read_config(void);
+struct fwd_data * fwd_read_config(struct fwd_handle *);
struct fwd_zone * fwd_lookup_zone(struct fwd_data *, const char *);
void fwd_free_config(struct fwd_data *);