diff options
author | mav <mav@FreeBSD.org> | 2007-05-22 12:23:39 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2007-05-22 12:23:39 +0000 |
commit | e8130fb9e7145026361832fba31c82e33c71963b (patch) | |
tree | b18790a55032e9649ec725f4024ba2fc0e740bb8 /sys/netgraph/ng_nat.c | |
parent | 519a3dd7a9f12da22d2a52d8489b98cbc4b81f35 (diff) | |
download | FreeBSD-src-e8130fb9e7145026361832fba31c82e33c71963b.zip FreeBSD-src-e8130fb9e7145026361832fba31c82e33c71963b.tar.gz |
Add support for setmode and settarget messages.
Approved by: glebius (mentor)
Diffstat (limited to 'sys/netgraph/ng_nat.c')
-rw-r--r-- | sys/netgraph/ng_nat.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/netgraph/ng_nat.c b/sys/netgraph/ng_nat.c index 761d38f..fb6e947 100644 --- a/sys/netgraph/ng_nat.c +++ b/sys/netgraph/ng_nat.c @@ -56,6 +56,16 @@ static ng_newhook_t ng_nat_newhook; static ng_rcvdata_t ng_nat_rcvdata; static ng_disconnect_t ng_nat_disconnect; +static unsigned int ng_nat_translate_flags(unsigned int x); + +/* Parse type for struct ng_nat_mode. */ +static const struct ng_parse_struct_field ng_nat_mode_fields[] + = NG_NAT_MODE_INFO; +static const struct ng_parse_type ng_nat_mode_type = { + &ng_parse_struct_type, + ng_nat_mode_fields +}; + /* List of commands and how to convert arguments to/from ASCII. */ static const struct ng_cmdlist ng_nat_cmdlist[] = { { @@ -65,6 +75,20 @@ static const struct ng_cmdlist ng_nat_cmdlist[] = { &ng_parse_ipaddr_type, NULL }, + { + NGM_NAT_COOKIE, + NGM_NAT_SET_MODE, + "setmode", + &ng_nat_mode_type, + NULL + }, + { + NGM_NAT_COOKIE, + NGM_NAT_SET_TARGET, + "settarget", + &ng_parse_ipaddr_type, + NULL + }, { 0 } }; @@ -178,6 +202,36 @@ ng_nat_rcvmsg(node_p node, item_p item, hook_p lasthook) priv->flags |= NGNAT_ADDR_DEFINED; } break; + case NGM_NAT_SET_MODE: + { + struct ng_nat_mode *const mode = + (struct ng_nat_mode *)msg->data; + + if (msg->header.arglen < sizeof(*mode)) { + error = EINVAL; + break; + } + + if (LibAliasSetMode(priv->lib, + ng_nat_translate_flags(mode->flags), + ng_nat_translate_flags(mode->mask)) < 0) { + error = ENOMEM; + break; + } + } + break; + case NGM_NAT_SET_TARGET: + { + struct in_addr *const ia = (struct in_addr *)msg->data; + + if (msg->header.arglen < sizeof(*ia)) { + error = EINVAL; + break; + } + + LibAliasSetTarget(priv->lib, *ia); + } + break; default: error = EINVAL; /* unknown command */ break; @@ -329,3 +383,25 @@ ng_nat_disconnect(hook_p hook) return (0); } +static unsigned int +ng_nat_translate_flags(unsigned int x) +{ + unsigned int res = 0; + + if (x & NG_NAT_LOG) + res |= PKT_ALIAS_LOG; + if (x & NG_NAT_DENY_INCOMING) + res |= PKT_ALIAS_DENY_INCOMING; + if (x & NG_NAT_SAME_PORTS) + res |= PKT_ALIAS_SAME_PORTS; + if (x & NG_NAT_UNREGISTERED_ONLY) + res |= PKT_ALIAS_UNREGISTERED_ONLY; + if (x & NG_NAT_RESET_ON_ADDR_CHANGE) + res |= PKT_ALIAS_RESET_ON_ADDR_CHANGE; + if (x & NG_NAT_PROXY_ONLY) + res |= PKT_ALIAS_PROXY_ONLY; + if (x & NG_NAT_REVERSE) + res |= PKT_ALIAS_REVERSE; + + return (res); +} |