summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp
diff options
context:
space:
mode:
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r--accel-pptpd/ppp/ipcp_opt_ipaddr.c10
-rw-r--r--accel-pptpd/ppp/ppp.c18
-rw-r--r--accel-pptpd/ppp/ppp.h6
-rw-r--r--accel-pptpd/ppp/ppp_auth.c6
-rw-r--r--accel-pptpd/ppp/ppp_ccp.c29
-rw-r--r--accel-pptpd/ppp/ppp_fsm.c14
-rw-r--r--accel-pptpd/ppp/ppp_fsm.h6
-rw-r--r--accel-pptpd/ppp/ppp_ipcp.c53
-rw-r--r--accel-pptpd/ppp/ppp_ipcp.h1
-rw-r--r--accel-pptpd/ppp/ppp_lcp.c35
-rw-r--r--accel-pptpd/ppp/ppp_lcp.h1
11 files changed, 124 insertions, 55 deletions
diff --git a/accel-pptpd/ppp/ipcp_opt_ipaddr.c b/accel-pptpd/ppp/ipcp_opt_ipaddr.c
index 2fa92519..ddfb3d20 100644
--- a/accel-pptpd/ppp/ipcp_opt_ipaddr.c
+++ b/accel-pptpd/ppp/ipcp_opt_ipaddr.c
@@ -40,7 +40,6 @@ static struct ipcp_option_t *ipaddr_init(struct ppp_ipcp_t *ipcp)
{
struct ipaddr_option_t *ipaddr_opt=malloc(sizeof(*ipaddr_opt));
memset(ipaddr_opt,0,sizeof(*ipaddr_opt));
- ipdb_get(&ipaddr_opt->addr,&ipaddr_opt->peer_addr);
ipaddr_opt->opt.id=CI_ADDR;
ipaddr_opt->opt.len=6;
@@ -51,6 +50,9 @@ static void ipaddr_free(struct ppp_ipcp_t *ipcp, struct ipcp_option_t *opt)
{
struct ipaddr_option_t *ipaddr_opt=container_of(opt,typeof(*ipaddr_opt),opt);
+ if (ipaddr_opt->peer_addr)
+ ipdb_put(ipcp->ppp, ipaddr_opt->addr, ipaddr_opt->peer_addr);
+
free(ipaddr_opt);
}
@@ -58,6 +60,12 @@ static int ipaddr_send_conf_req(struct ppp_ipcp_t *ipcp, struct ipcp_option_t *o
{
struct ipaddr_option_t *ipaddr_opt=container_of(opt,typeof(*ipaddr_opt),opt);
struct ipcp_opt32_t *opt32=(struct ipcp_opt32_t*)ptr;
+
+ if (!ipaddr_opt->addr && ipdb_get(ipcp->ppp, &ipaddr_opt->addr, &ipaddr_opt->peer_addr)) {
+ log_warn("ppp:ipcp: no free IP address\n");
+ return -1;
+ }
+
opt32->hdr.id=CI_ADDR;
opt32->hdr.len=6;
opt32->val=ipaddr_opt->addr;
diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c
index 4ad8221b..247f8198 100644
--- a/accel-pptpd/ppp/ppp.c
+++ b/accel-pptpd/ppp/ppp.c
@@ -17,6 +17,8 @@
#include "ppp_fsm.h"
#include "log.h"
+int conf_ppp_verbose;
+
static LIST_HEAD(layers);
int sock_fd;
@@ -302,7 +304,10 @@ void __export ppp_layer_started(struct ppp_t *ppp, struct ppp_layer_data_t *d)
list_for_each_entry(d,&n->items,entry)
{
d->starting=1;
- d->layer->start(d);
+ if (d->layer->start(d)) {
+ ppp_terminate(ppp, 0);
+ return;
+ }
}
}
}
@@ -464,7 +469,10 @@ static void start_first_layer(struct ppp_t *ppp)
list_for_each_entry(d,&n->items,entry)
{
d->starting=1;
- d->layer->start(d);
+ if (d->layer->start(d)) {
+ ppp_terminate(ppp, 0);
+ return;
+ }
}
}
@@ -487,9 +495,15 @@ struct ppp_layer_data_t *ppp_find_layer_data(struct ppp_t *ppp, struct ppp_layer
static void __init ppp_init(void)
{
+ char *opt;
+
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0) {
perror("socket");
_exit(EXIT_FAILURE);
}
+
+ opt = conf_get_opt("ppp", "verbose");
+ if (opt && atoi(opt) > 0)
+ conf_ppp_verbose = 1;
}
diff --git a/accel-pptpd/ppp/ppp.h b/accel-pptpd/ppp/ppp.h
index da2fb97c..e287b7b1 100644
--- a/accel-pptpd/ppp/ppp.h
+++ b/accel-pptpd/ppp/ppp.h
@@ -45,7 +45,7 @@ struct ppp_t;
struct ppp_ctrl_t
{
- struct triton_ctx_t *ctx;
+ struct triton_context_t *ctx;
void (*started)(struct ppp_t*);
void (*finished)(struct ppp_t*);
};
@@ -111,7 +111,7 @@ struct ppp_layer_t
{
struct list_head entry;
struct ppp_layer_data_t *(*init)(struct ppp_t *);
- void (*start)(struct ppp_layer_data_t*);
+ int (*start)(struct ppp_layer_data_t*);
void (*finish)(struct ppp_layer_data_t*);
void (*free)(struct ppp_layer_data_t *);
};
@@ -146,5 +146,7 @@ void ppp_unregister_notified(struct ppp_notified_t *);
void ppp_notify_started(struct ppp_t *ppp);
void ppp_notify_finished(struct ppp_t *ppp);
+extern int conf_ppp_verbose;
+
extern int sock_fd; // internet socket for ioctls
#endif
diff --git a/accel-pptpd/ppp/ppp_auth.c b/accel-pptpd/ppp/ppp_auth.c
index 32f63d5b..b767fdbd 100644
--- a/accel-pptpd/ppp/ppp_auth.c
+++ b/accel-pptpd/ppp/ppp_auth.c
@@ -22,7 +22,7 @@ static int auth_recv_conf_ack(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, u
static void auth_print(void (*print)(const char *fmt,...),struct lcp_option_t*, uint8_t *ptr);
static struct ppp_layer_data_t *auth_layer_init(struct ppp_t*);
-static void auth_layer_start(struct ppp_layer_data_t *);
+static int auth_layer_start(struct ppp_layer_data_t *);
static void auth_layer_finish(struct ppp_layer_data_t *);
static void auth_layer_free(struct ppp_layer_data_t *);
@@ -257,7 +257,7 @@ static struct ppp_layer_data_t *auth_layer_init(struct ppp_t *ppp)
return &ad->ld;
}
-static void auth_layer_start(struct ppp_layer_data_t *ld)
+static int auth_layer_start(struct ppp_layer_data_t *ld)
{
struct auth_layer_data_t *ad=container_of(ld,typeof(*ad),ld);
@@ -270,6 +270,8 @@ static void auth_layer_start(struct ppp_layer_data_t *ld)
log_debug("auth_layer_started\n");
ppp_layer_started(ad->ppp,ld);
}
+
+ return 0;
}
static void auth_layer_finish(struct ppp_layer_data_t *ld)
diff --git a/accel-pptpd/ppp/ppp_ccp.c b/accel-pptpd/ppp/ppp_ccp.c
index fe10886e..f895da9b 100644
--- a/accel-pptpd/ppp/ppp_ccp.c
+++ b/accel-pptpd/ppp/ppp_ccp.c
@@ -24,7 +24,7 @@ static LIST_HEAD(option_handlers);
static void ccp_layer_up(struct ppp_fsm_t*);
static void ccp_layer_down(struct ppp_fsm_t*);
-static void send_conf_req(struct ppp_fsm_t*);
+static int send_conf_req(struct ppp_fsm_t*);
static void send_conf_ack(struct ppp_fsm_t*);
static void send_conf_nak(struct ppp_fsm_t*);
static void send_conf_rej(struct ppp_fsm_t*);
@@ -90,7 +90,7 @@ static struct ppp_layer_data_t *ccp_layer_init(struct ppp_t *ppp)
return &ccp->ld;
}
-void ccp_layer_start(struct ppp_layer_data_t *ld)
+int ccp_layer_start(struct ppp_layer_data_t *ld)
{
struct ppp_ccp_t *ccp=container_of(ld,typeof(*ccp),ld);
@@ -98,7 +98,10 @@ void ccp_layer_start(struct ppp_layer_data_t *ld)
ccp_options_init(ccp);
ppp_fsm_lower_up(&ccp->fsm);
- ppp_fsm_open(&ccp->fsm);
+ if (ppp_fsm_open(&ccp->fsm))
+ return -1;
+
+ return 0;
}
void ccp_layer_finish(struct ppp_layer_data_t *ld)
@@ -107,12 +110,8 @@ void ccp_layer_finish(struct ppp_layer_data_t *ld)
log_debug("ccp_layer_finish\n");
- ppp_fsm_lower_down(&ccp->fsm);
-
- ppp_unregister_handler(ccp->ppp,&ccp->hnd);
- ccp_options_free(ccp);
-
- ppp_layer_finished(ccp->ppp,ld);
+ ccp->fsm.fsm_state = FSM_Closed;
+ ppp_layer_finished(ccp->ppp,&ccp->ld);
}
void ccp_layer_free(struct ppp_layer_data_t *ld)
@@ -121,6 +120,10 @@ void ccp_layer_free(struct ppp_layer_data_t *ld)
log_debug("ccp_layer_free\n");
+ ppp_unregister_handler(ccp->ppp,&ccp->hnd);
+ ccp_options_free(ccp);
+ ppp_fsm_free(&ccp->fsm);
+
free(ccp);
}
@@ -151,7 +154,7 @@ static void print_ropt(struct recv_opt_t *ropt)
log_debug(" >");
}
-static void send_conf_req(struct ppp_fsm_t *fsm)
+static int send_conf_req(struct ppp_fsm_t *fsm)
{
struct ppp_ccp_t *ccp=container_of(fsm,typeof(*ccp),fsm);
uint8_t *buf=malloc(ccp->conf_req_len), *ptr=buf;
@@ -171,6 +174,8 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
list_for_each_entry(lopt,&ccp->options,entry)
{
n=lopt->h->send_conf_req(ccp,lopt,ptr);
+ if (n < 0)
+ return -1;
if (n)
{
log_debug(" ");
@@ -183,6 +188,8 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
ccp_hdr->len=htons((ptr-buf)-2);
ppp_unit_send(ccp->ppp,ccp_hdr,ptr-buf);
+
+ return 0;
}
static void send_conf_ack(struct ppp_fsm_t *fsm)
@@ -473,7 +480,7 @@ static void ccp_recv(struct ppp_handler_t*h)
if (ccp->fsm.fsm_state==FSM_Initial || ccp->fsm.fsm_state==FSM_Closed)
{
- log_error("CCP: discaring packet\n");
+ log_warn("CCP: discaring packet\n");
return;
}
diff --git a/accel-pptpd/ppp/ppp_fsm.c b/accel-pptpd/ppp/ppp_fsm.c
index 85cf15a2..a99453f0 100644
--- a/accel-pptpd/ppp/ppp_fsm.c
+++ b/accel-pptpd/ppp/ppp_fsm.c
@@ -38,7 +38,7 @@ void ppp_fsm_free(struct ppp_fsm_t *layer)
stop_timer(layer);
}
-void ppp_fsm_lower_up(struct ppp_fsm_t *layer)
+int ppp_fsm_lower_up(struct ppp_fsm_t *layer)
{
switch(layer->fsm_state)
{
@@ -49,12 +49,15 @@ void ppp_fsm_lower_up(struct ppp_fsm_t *layer)
//if (layer->init_req_cnt) layer->init_req_cnt(layer);
init_req_counter(layer,layer->max_configure);
--layer->restart_counter;
- if (layer->send_conf_req) layer->send_conf_req(layer);
+ if (layer->send_conf_req)
+ if (layer->send_conf_req(layer))
+ return -1;
layer->fsm_state=FSM_Req_Sent;
break;
default:
break;
}
+ return 0;
}
void ppp_fsm_lower_down(struct ppp_fsm_t *layer)
@@ -84,7 +87,7 @@ void ppp_fsm_lower_down(struct ppp_fsm_t *layer)
}
}
-void ppp_fsm_open(struct ppp_fsm_t *layer)
+int ppp_fsm_open(struct ppp_fsm_t *layer)
{
switch(layer->fsm_state)
{
@@ -98,7 +101,9 @@ void ppp_fsm_open(struct ppp_fsm_t *layer)
//if (layer->init_req_cnt) layer->init_req_cnt(layer);
init_req_counter(layer,layer->max_configure);
--layer->restart_counter;
- if (layer->send_conf_req) layer->send_conf_req(layer);
+ if (layer->send_conf_req)
+ if (layer->send_conf_req(layer))
+ return -1;
layer->fsm_state=FSM_Req_Sent;
break;
case FSM_Closing:
@@ -111,6 +116,7 @@ void ppp_fsm_open(struct ppp_fsm_t *layer)
default:
break;
}
+ return 0;
}
void ppp_fsm_close(struct ppp_fsm_t *layer)
diff --git a/accel-pptpd/ppp/ppp_fsm.h b/accel-pptpd/ppp/ppp_fsm.h
index bc958fe9..908936db 100644
--- a/accel-pptpd/ppp/ppp_fsm.h
+++ b/accel-pptpd/ppp/ppp_fsm.h
@@ -37,7 +37,7 @@ struct ppp_fsm_t
void (*layer_down)(struct ppp_fsm_t*);
void (*layer_started)(struct ppp_fsm_t*);
void (*layer_finished)(struct ppp_fsm_t*);
- void (*send_conf_req)(struct ppp_fsm_t*);
+ int (*send_conf_req)(struct ppp_fsm_t*);
void (*send_conf_ack)(struct ppp_fsm_t*);
void (*send_conf_nak)(struct ppp_fsm_t*);
void (*send_conf_rej)(struct ppp_fsm_t*);
@@ -46,9 +46,9 @@ struct ppp_fsm_t
void ppp_fsm_init(struct ppp_fsm_t*);
void ppp_fsm_free(struct ppp_fsm_t*);
-void ppp_fsm_lower_up(struct ppp_fsm_t*);
+int ppp_fsm_lower_up(struct ppp_fsm_t*);
void ppp_fsm_lower_down(struct ppp_fsm_t*);
-void ppp_fsm_open(struct ppp_fsm_t*);
+int ppp_fsm_open(struct ppp_fsm_t*);
void ppp_fsm_close(struct ppp_fsm_t*);
void ppp_fsm_timeout0(struct ppp_fsm_t *layer);
void ppp_fsm_timeout1(struct ppp_fsm_t *layer);
diff --git a/accel-pptpd/ppp/ppp_ipcp.c b/accel-pptpd/ppp/ppp_ipcp.c
index 6ac145b2..bb6369e0 100644
--- a/accel-pptpd/ppp/ppp_ipcp.c
+++ b/accel-pptpd/ppp/ppp_ipcp.c
@@ -24,7 +24,7 @@ static LIST_HEAD(option_handlers);
static void ipcp_layer_up(struct ppp_fsm_t*);
static void ipcp_layer_down(struct ppp_fsm_t*);
-static void send_conf_req(struct ppp_fsm_t*);
+static int send_conf_req(struct ppp_fsm_t*);
static void send_conf_ack(struct ppp_fsm_t*);
static void send_conf_nak(struct ppp_fsm_t*);
static void send_conf_rej(struct ppp_fsm_t*);
@@ -90,7 +90,7 @@ static struct ppp_layer_data_t *ipcp_layer_init(struct ppp_t *ppp)
return &ipcp->ld;
}
-void ipcp_layer_start(struct ppp_layer_data_t *ld)
+int ipcp_layer_start(struct ppp_layer_data_t *ld)
{
struct ppp_ipcp_t *ipcp=container_of(ld,typeof(*ipcp),ld);
@@ -98,7 +98,10 @@ void ipcp_layer_start(struct ppp_layer_data_t *ld)
ipcp_options_init(ipcp);
ppp_fsm_lower_up(&ipcp->fsm);
- ppp_fsm_open(&ipcp->fsm);
+ if (ppp_fsm_open(&ipcp->fsm))
+ return -1;
+
+ return 0;
}
void ipcp_layer_finish(struct ppp_layer_data_t *ld)
@@ -107,12 +110,8 @@ void ipcp_layer_finish(struct ppp_layer_data_t *ld)
log_debug("ipcp_layer_finish\n");
- ppp_fsm_lower_down(&ipcp->fsm);
-
- ppp_unregister_handler(ipcp->ppp,&ipcp->hnd);
- ipcp_options_free(ipcp);
-
- ppp_layer_finished(ipcp->ppp,ld);
+ ipcp->fsm.fsm_state = FSM_Closed;
+ ppp_layer_finished(ipcp->ppp,&ipcp->ld);
}
void ipcp_layer_free(struct ppp_layer_data_t *ld)
@@ -121,6 +120,10 @@ void ipcp_layer_free(struct ppp_layer_data_t *ld)
log_debug("ipcp_layer_free\n");
+ ppp_unregister_handler(ipcp->ppp,&ipcp->hnd);
+ ipcp_options_free(ipcp);
+ ppp_fsm_free(&ipcp->fsm);
+
free(ipcp);
}
@@ -151,7 +154,7 @@ static void print_ropt(struct recv_opt_t *ropt)
log_debug(" >");
}
-static void send_conf_req(struct ppp_fsm_t *fsm)
+static int send_conf_req(struct ppp_fsm_t *fsm)
{
struct ppp_ipcp_t *ipcp=container_of(fsm,typeof(*ipcp),fsm);
uint8_t *buf=malloc(ipcp->conf_req_len), *ptr=buf;
@@ -159,30 +162,40 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
struct ipcp_option_t *lopt;
int n;
- log_debug("send [IPCP ConfReq");
ipcp_hdr->proto=htons(PPP_IPCP);
ipcp_hdr->code=CONFREQ;
ipcp_hdr->id=++ipcp->fsm.id;
ipcp_hdr->len=0;
- log_debug(" id=%x",ipcp_hdr->id);
ptr+=sizeof(*ipcp_hdr);
list_for_each_entry(lopt,&ipcp->options,entry)
{
- n=lopt->h->send_conf_req(ipcp,lopt,ptr);
- if (n)
- {
- log_debug(" ");
- lopt->h->print(log_debug,lopt,NULL);
+ n = lopt->h->send_conf_req(ipcp, lopt, ptr);
+ if (n < 0)
+ return -1;
+ if (n) {
ptr+=n;
+ lopt->print = 1;
+ } else
+ lopt->print = 0;
+ }
+
+ if (conf_ppp_verbose) {
+ log_debug("send [IPCP ConfReq id=%x", ipcp_hdr->id);
+ list_for_each_entry(lopt,&ipcp->options,entry){
+ if (lopt->print) {
+ log_debug(" ");
+ lopt->h->print(log_debug,lopt,NULL);
+ }
}
+ log_debug("]\n");
}
-
- log_debug("]\n");
ipcp_hdr->len=htons((ptr-buf)-2);
ppp_unit_send(ipcp->ppp,ipcp_hdr,ptr-buf);
+
+ return 0;
}
static void send_conf_ack(struct ppp_fsm_t *fsm)
@@ -464,7 +477,7 @@ static void ipcp_recv(struct ppp_handler_t*h)
if (ipcp->fsm.fsm_state==FSM_Initial || ipcp->fsm.fsm_state==FSM_Closed)
{
- log_error("IPCP: discaring packet\n");
+ log_warn("IPCP: discaring packet\n");
return;
}
diff --git a/accel-pptpd/ppp/ppp_ipcp.h b/accel-pptpd/ppp/ppp_ipcp.h
index 9e0c99ee..266ab7df 100644
--- a/accel-pptpd/ppp/ppp_ipcp.h
+++ b/accel-pptpd/ppp/ppp_ipcp.h
@@ -56,6 +56,7 @@ struct ipcp_option_t
int id;
int len;
int state;
+ int print:1;
struct ipcp_option_handler_t *h;
};
diff --git a/accel-pptpd/ppp/ppp_lcp.c b/accel-pptpd/ppp/ppp_lcp.c
index afcfc102..22e6313d 100644
--- a/accel-pptpd/ppp/ppp_lcp.c
+++ b/accel-pptpd/ppp/ppp_lcp.c
@@ -27,7 +27,7 @@ static LIST_HEAD(option_handlers);
static void lcp_layer_up(struct ppp_fsm_t*);
static void lcp_layer_down(struct ppp_fsm_t*);
-static void send_conf_req(struct ppp_fsm_t*);
+static int send_conf_req(struct ppp_fsm_t*);
static void send_conf_ack(struct ppp_fsm_t*);
static void send_conf_nak(struct ppp_fsm_t*);
static void send_conf_rej(struct ppp_fsm_t*);
@@ -95,7 +95,7 @@ static struct ppp_layer_data_t *lcp_layer_init(struct ppp_t *ppp)
return &lcp->ld;
}
-void lcp_layer_start(struct ppp_layer_data_t *ld)
+int lcp_layer_start(struct ppp_layer_data_t *ld)
{
struct ppp_lcp_t *lcp=container_of(ld,typeof(*lcp),ld);
@@ -103,7 +103,10 @@ void lcp_layer_start(struct ppp_layer_data_t *ld)
lcp_options_init(lcp);
ppp_fsm_lower_up(&lcp->fsm);
- ppp_fsm_open(&lcp->fsm);
+ if (ppp_fsm_open(&lcp->fsm))
+ return -1;
+
+ return 0;
}
void lcp_layer_finish(struct ppp_layer_data_t *ld)
@@ -161,7 +164,7 @@ static void print_ropt(struct recv_opt_t *ropt)
log_debug(" >");
}
-static void send_conf_req(struct ppp_fsm_t *fsm)
+static int send_conf_req(struct ppp_fsm_t *fsm)
{
struct ppp_lcp_t *lcp=container_of(fsm,typeof(*lcp),fsm);
uint8_t *buf=malloc(lcp->conf_req_len), *ptr=buf;
@@ -169,30 +172,42 @@ static void send_conf_req(struct ppp_fsm_t *fsm)
struct lcp_option_t *lopt;
int n;
- log_debug("send [LCP ConfReq");
lcp_hdr->proto=htons(PPP_LCP);
lcp_hdr->code=CONFREQ;
lcp_hdr->id=++lcp->fsm.id;
lcp_hdr->len=0;
- log_debug(" id=%x",lcp_hdr->id);
ptr+=sizeof(*lcp_hdr);
list_for_each_entry(lopt,&lcp->options,entry)
{
n=lopt->h->send_conf_req(lcp,lopt,ptr);
+ if (n < 0)
+ return -1;
if (n)
{
- log_debug(" ");
- lopt->h->print(log_debug,lopt,NULL);
ptr+=n;
- }
+ lopt->print = 1;
+ } else
+ lopt->print = 0;
}
- log_debug("]\n");
+ if (conf_ppp_verbose) {
+ log_debug("send [LCP ConfReq id=%x", lcp_hdr->id);
+ list_for_each_entry(lopt,&lcp->options,entry)
+ {
+ if (lopt->print) {
+ log_debug(" ");
+ lopt->h->print(log_debug,lopt,NULL);
+ }
+ }
+ log_debug("]\n");
+ }
lcp_hdr->len=htons((ptr-buf)-2);
ppp_chan_send(lcp->ppp,lcp_hdr,ptr-buf);
+
+ return 0;
}
static void send_conf_ack(struct ppp_fsm_t *fsm)
diff --git a/accel-pptpd/ppp/ppp_lcp.h b/accel-pptpd/ppp/ppp_lcp.h
index 46bc17b9..661f200c 100644
--- a/accel-pptpd/ppp/ppp_lcp.h
+++ b/accel-pptpd/ppp/ppp_lcp.h
@@ -90,6 +90,7 @@ struct lcp_option_t
int id;
int len;
int state;
+ int print:1;
struct lcp_option_handler_t *h;
};