summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2007-05-22 12:14:43 +0000
committermav <mav@FreeBSD.org>2007-05-22 12:14:43 +0000
commit519a3dd7a9f12da22d2a52d8489b98cbc4b81f35 (patch)
treed7b192b83701e541b22f501a5ad876a8f1e7939f
parentef7aa6f3c17722948f443f45c9b612f21b5068e4 (diff)
downloadFreeBSD-src-519a3dd7a9f12da22d2a52d8489b98cbc4b81f35.zip
FreeBSD-src-519a3dd7a9f12da22d2a52d8489b98cbc4b81f35.tar.gz
Allow node to bypass traffic while no alias address defined.
Approved by: glebius (mentor)
-rw-r--r--sys/netgraph/ng_nat.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/sys/netgraph/ng_nat.c b/sys/netgraph/ng_nat.c
index 0e2097d..761d38f 100644
--- a/sys/netgraph/ng_nat.c
+++ b/sys/netgraph/ng_nat.c
@@ -94,7 +94,7 @@ struct ng_nat_priv {
typedef struct ng_nat_priv *priv_p;
/* Values of flags */
-#define NGNAT_READY 0x1 /* We have everything to work */
+#define NGNAT_CONNECTED 0x1 /* We have both hooks connected */
#define NGNAT_ADDR_DEFINED 0x2 /* NGM_NAT_SET_IPADDR happened */
static int
@@ -145,9 +145,8 @@ ng_nat_newhook(node_p node, hook_p hook, const char *name)
return (EINVAL);
if (priv->out != NULL &&
- priv->in != NULL &&
- priv->flags & NGNAT_ADDR_DEFINED)
- priv->flags |= NGNAT_READY;
+ priv->in != NULL)
+ priv->flags |= NGNAT_CONNECTED;
return(0);
}
@@ -177,9 +176,6 @@ ng_nat_rcvmsg(node_p node, item_p item, hook_p lasthook)
LibAliasSetAddress(priv->lib, *ia);
priv->flags |= NGNAT_ADDR_DEFINED;
- if (priv->out != NULL &&
- priv->in != NULL)
- priv->flags |= NGNAT_READY;
}
break;
default:
@@ -206,11 +202,16 @@ ng_nat_rcvdata(hook_p hook, item_p item )
int rval, error = 0;
char *c;
- if (!(priv->flags & NGNAT_READY)) {
+ /* We have no required hooks. */
+ if (!(priv->flags & NGNAT_CONNECTED)) {
NG_FREE_ITEM(item);
return (ENXIO);
}
+ /* We have no alias address yet to do anything. */
+ if (!(priv->flags & NGNAT_ADDR_DEFINED))
+ goto send;
+
m = NGI_M(item);
if ((m = m_megapullup(m, m->m_pkthdr.len)) == NULL) {
@@ -288,6 +289,7 @@ ng_nat_rcvdata(hook_p hook, item_p item )
}
}
+send:
if (hook == priv->in)
NG_FWD_ITEM_HOOK(error, item, priv->out);
else
@@ -314,7 +316,7 @@ ng_nat_disconnect(hook_p hook)
{
const priv_p priv = NG_NODE_PRIVATE(NG_HOOK_NODE(hook));
- priv->flags &= ~NGNAT_READY;
+ priv->flags &= ~NGNAT_CONNECTED;
if (hook == priv->out)
priv->out = NULL;
OpenPOWER on IntegriCloud