Add support for setmode and settarget messages.
Approved by: glebius (mentor)
This commit is contained in:
parent
179f56e196
commit
e842c54054
|
@ -60,6 +60,27 @@ This node type supports the generic control messages, plus the following:
|
|||
Configure aliasing address for a node.
|
||||
After both hooks have been connected and aliasing address was configured,
|
||||
a node is ready for aliasing operation.
|
||||
.It Dv NGM_NAT_SET_MODE Pq Li setmode
|
||||
Set node's operation mode using supplied
|
||||
.Vt "struct ng_nat_mode".
|
||||
.Bd -literal
|
||||
struct ng_nat_mode {
|
||||
uint32_t flags;
|
||||
uint32_t mask;
|
||||
};
|
||||
/* Supported flags: */
|
||||
#define NG_NAT_LOG 0x01
|
||||
#define NG_NAT_DENY_INCOMING 0x02
|
||||
#define NG_NAT_SAME_PORTS 0x04
|
||||
#define NG_NAT_UNREGISTERED_ONLY 0x10
|
||||
#define NG_NAT_RESET_ON_ADDR_CHANGE 0x20
|
||||
#define NG_NAT_PROXY_ONLY 0x40
|
||||
#define NG_NAT_REVERSE 0x80
|
||||
.Ed
|
||||
.It Dv NGM_NAT_SET_TARGET Pq Li settarget
|
||||
Configure target address for a node.
|
||||
When an incoming packet not associated with any pre-existing aliasing
|
||||
link arrives at the host machine, it will be sent to the specified address.
|
||||
.El
|
||||
.Sh SHUTDOWN
|
||||
This node shuts down upon receipt of a
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -32,6 +32,29 @@
|
|||
#define NG_NAT_HOOK_IN "in"
|
||||
#define NG_NAT_HOOK_OUT "out"
|
||||
|
||||
/* Arguments for NGM_NAT_SET_MODE message */
|
||||
struct ng_nat_mode {
|
||||
uint32_t flags;
|
||||
uint32_t mask;
|
||||
};
|
||||
|
||||
/* Keep this in sync with the above structure definition */
|
||||
#define NG_NAT_MODE_INFO { \
|
||||
{ "flags", &ng_parse_uint32_type }, \
|
||||
{ "mask", &ng_parse_uint32_type }, \
|
||||
{ NULL } \
|
||||
}
|
||||
|
||||
#define NG_NAT_LOG 0x01
|
||||
#define NG_NAT_DENY_INCOMING 0x02
|
||||
#define NG_NAT_SAME_PORTS 0x04
|
||||
#define NG_NAT_UNREGISTERED_ONLY 0x10
|
||||
#define NG_NAT_RESET_ON_ADDR_CHANGE 0x20
|
||||
#define NG_NAT_PROXY_ONLY 0x40
|
||||
#define NG_NAT_REVERSE 0x80
|
||||
|
||||
enum {
|
||||
NGM_NAT_SET_IPADDR = 1,
|
||||
NGM_NAT_SET_MODE,
|
||||
NGM_NAT_SET_TARGET,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue