diff --git a/file.c b/file.c index 17dc377..29fcb66 100644 --- a/file.c +++ b/file.c @@ -676,6 +676,22 @@ int set_pass_peer (char *word, char *value, int context, void *item) return 0; } +int set_trust_remotenumber (char *word, char *value, int context, void *item) +{ + switch (context & ~CONTEXT_DEFAULT) + { + case CONTEXT_LNS: + if (set_boolean (word, value, &(((struct lns *) item)->trust_remotenumber))) + return -1; + break; + default: + snprintf (filerr, sizeof (filerr), "'%s' not valid in this context\n", + word); + return -1; + } + return 0; +} + int set_pppoptfile (char *word, char *value, int context, void *item) { struct lac *l = (struct lac *) item; @@ -1611,6 +1627,7 @@ struct keyword words[] = { {"hostname", &set_hostname}, {"ppp debug", &set_debug}, {"pass peer", &set_pass_peer}, + {"trust remotenumber", &set_trust_remotenumber}, {"pppoptfile", &set_pppoptfile}, {"call rws", &set_rws}, {"tunnel rws", &set_rws}, diff --git a/file.h b/file.h index a2707c2..9d76359 100644 --- a/file.h +++ b/file.h @@ -97,6 +97,7 @@ struct lns int proxyauth; /* Allow proxy authentication? */ int debug; /* Debug PPP? */ int pass_peer; /* Pass peer IP to pppd as ipparam? */ + int trust_remotenumber; /* Whether or not to trust remotely supplied "Dialing Number" AVP */ char pppoptfile[STRLEN]; /* File containing PPP options */ struct tunnel *t; /* Tunnel of this, if it's ready */ }; diff --git a/xl2tpd.c b/xl2tpd.c index 3195988..b551146 100644 --- a/xl2tpd.c +++ b/xl2tpd.c @@ -495,6 +495,14 @@ int start_pppd (struct call *c, struct ppp_opts *opts) } { + stropt[pos++] = strdup("remotenumber"); + if (c->dialing[0] && (!c->lns || c->lns->trust_remotenumber)) { + /* if a remotenumber is available, and we're a LAC or the remote "dialing number" AVP is trusted */ + stropt[pos++] = strdup(c->dialing); + } else { + stropt[pos++] = strdup(IPADDY(c->container->peer.sin_addr)); + } + struct ppp_opts *p = opts; int maxn_opts = sizeof(stropt) / sizeof(stropt[0]) - 1; while (p && pos < maxn_opts)