diff options
author | Kozlov Dmitry <dima@server> | 2010-08-03 17:11:50 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-08-03 17:11:50 +0400 |
commit | 8a9babb739f2a9da045c749718bbe85aad5f0dd3 (patch) | |
tree | c016ab68af0d54223a3716cd7b0508b2cb0291dd /accel-pptpd | |
parent | 5a2d6079eba1c7e2a9479cb10d714b5a97bbfe4f (diff) | |
download | accel-ppp-8a9babb739f2a9da045c749718bbe85aad5f0dd3.tar.gz accel-ppp-8a9babb739f2a9da045c749718bbe85aad5f0dd3.zip |
writing code ...
Diffstat (limited to 'accel-pptpd')
-rw-r--r-- | accel-pptpd/ppp.h | 15 | ||||
-rw-r--r-- | accel-pptpd/ppp_fsm.h | 14 | ||||
-rw-r--r-- | accel-pptpd/ppp_lcp.c | 136 |
3 files changed, 133 insertions, 32 deletions
diff --git a/accel-pptpd/ppp.h b/accel-pptpd/ppp.h index e640229f..8e8558bb 100644 --- a/accel-pptpd/ppp.h +++ b/accel-pptpd/ppp.h @@ -54,18 +54,11 @@ struct ppp_t char *chan_name; + //options int mtu,mru; - int require_mppe:1; - int require_pap:1; - int require_chap:1; - int require_mschap:1; - int require_mschap_v2:1; - - int allow_mppe:1; - int allow_pap:1; - int allow_chap:1; - int allow_mschap:1; - int allow_mschap_v2:1; + int accomp; // 0 - disabled, 1 - enable, 2 - allow, disabled, 3 - allow,enabled + int pcomp; // 0 - disabled, 1 - enable, 2 - allow, disabled, 3 - allow,enabled + // int log:1; diff --git a/accel-pptpd/ppp_fsm.h b/accel-pptpd/ppp_fsm.h index f07735d1..c4430c4d 100644 --- a/accel-pptpd/ppp_fsm.h +++ b/accel-pptpd/ppp_fsm.h @@ -21,11 +21,17 @@ struct ppp_hdr_t; struct lcp_options_t { + int mtu; int mru; - int auth; - int magic; - int accomp; - int pcomp; + int accomp; // 0 - disabled, 1 - enable, 2 - allow, disabled, 3 - allow,enabled + int pcomp; // 0 - disabled, 1 - enable, 2 - allow, disabled, 3 - allow,enabled + int auth[3]; // 0 - none, 1 - pap, 2 - eap, 3 - mschap + // negotiated options; + int neg_mru; + int neg_mtu; + int neg_accomp; // -1 - rejected + int neg_pcomp; + int neg_auth; }; struct ppp_layer_t diff --git a/accel-pptpd/ppp_lcp.c b/accel-pptpd/ppp_lcp.c index 8f9c88b9..8b4e4777 100644 --- a/accel-pptpd/ppp_lcp.c +++ b/accel-pptpd/ppp_lcp.c @@ -13,7 +13,7 @@ char* accomp="allow,disabled"; char* pcomp="allow,disabled"; -char* auth="pap,mschap-v2"; +char* auth="pap,eap,mschap-v2"; char* mppe="allow,disabled"; char* pwdb="radius"; @@ -25,9 +25,9 @@ char* pwdb="radius"; #define CI_ASYNCMAP 2 /* Async Control Character Map */ #define CI_AUTHTYPE 3 /* Authentication Type */ #define CI_QUALITY 4 /* Quality Protocol */ -#define CI_MAGICNUMBER 5 /* Magic Number */ -#define CI_PCOMPRESSION 7 /* Protocol Field Compression */ -#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ +#define CI_MAGIC 5 /* Magic Number */ +#define CI_PCOMP 7 /* Protocol Field Compression */ +#define CI_ACCOMP 8 /* Address/Control Field Compression */ #define CI_FCSALTERN 9 /* FCS-Alternatives */ #define CI_SDP 10 /* Self-Describing-Pad */ #define CI_NUMBERED 11 /* Numbered-Mode */ @@ -44,6 +44,33 @@ char* pwdb="radius"; #define CI_I18N 28 /* Internationalization */ #define CI_SDL 29 /* Simple Data Link */ +struct lcp_hdr_t +{ + uint8_t code; + uint8_t id; + uint16_t len; +} __attribute__((packed)); +struct lcp_opt_hdr_t +{ + uint8_t type; + uint8_t len; +} __attribute__((packed)); +struct lcp_opt8_t +{ + struct lcp_opt_hdr_t hdr; + uint8_t val; +} __attribute__((packed)); +struct lcp_opt16_t +{ + struct lcp_opt_hdr_t hdr; + uint16_t val; +} __attribute__((packed)); +struct lcp_opt32_t +{ + struct lcp_opt_hdr_t hdr; + uint32_t val; +} __attribute__((packed)); + /*static void layer_up(struct ppp_layer_t*); static void layer_down(struct ppp_layer_t*); static void layer_started(struct ppp_layer_t*); @@ -109,6 +136,54 @@ static void layer_finished(struct ppp_layer_t*) }*/ static void send_conf_req(struct ppp_layer_t*l) { + uint8_t buf[128],*ptr; + struct lcp_opt_hdr_t *opt0; + struct lcp_opt8_t *opt8; + struct lcp_opt16_t *opt16; + struct lcp_opt24_t *opt24; + struct lcp_hdr_t *lcp_hdr=(struct lcp_hdr_t*)ptr; ptr+=sizeof(*lcp_hdr); + + log_msg("send [LCP ConfReq"); + lcp_hdr->code=CONFREQ; + lcp_hdr->id=++l->seq; + lcp_hdr->len=0; + log_msg(" id=%x",lcp_hdr->id); + + //mru + opt16=(struct lcp_opt16_t*)ptr; ptr+=sizeof(*opt16); + opt16.hdr.type=CI_MRU; + opt16.hdr.len=4; + opt16.val=htons(l->options.lcp.mtu); + log_msg(" <mru %i>",l->options.lcp.mtu); + + //auth + + //magic + opt32=(struct lcp_opt32_t*)ptr; ptr+=sizeof(*opt32); + opt32.hdr.type=CI_MAGIC; + opt32.hdr.len=6; + opt32.val=htonl(l->options.lcp.magic); + log_msg(" <magic %x>",l->options.lcp.magic); + + + //pcomp + if (l->options.lcp.pcomp==1 || (l->options.lcp.pcomp==3 && l->options.lcp.neg_pcomp!=-1)) + { + opt0=(struct lcp_opt_hdr_t*)ptr; ptr+=sizeof(*opt0); + opt0.type=CI_PCOMP; + opt0.len=2; + log_msg(" <pcomp>"); + } + + //acccomp + if (l->options.lcp.accomp==1 || (l->options.lcp.accomp==3 && l->options.lcp.neg_accomp!=-1)) + { + opt0=(struct lcp_opt_hdr_t*)ptr; ptr+=sizeof(*opt0); + opt0.type=CI_ACCOMP; + opt0.len=2; + log_msg(" <accomp>"); + } + log_msg("\n"); } static void send_conf_ack(struct ppp_layer_t*l) { @@ -120,20 +195,30 @@ static void send_conf_rej(struct ppp_layer_t*l) { } -static int lcp_recv_conf_req(struct ppp_layer_t*l,u_int8_t *data,int size) +static int lcp_recv_conf_req(struct ppp_layer_t*l,uint8_t *data,int size) { - struct ppp_opt_t *opt; + struct lcp_opt_hdr_t *opt; + struct lcp_opt8_t *opt8; + struct lcp_opt16_t *opt16; + struct lcp_opt32_t *opt32; + int ret=0; + + log_debug("recv [LCP ConfReq id=%x",l->recv_id); + while(size) { - opt=(struct ppp_opt_t *)data; + opt=(struct lcp_opt_hdr_t *)data; switch(opt->type) { case CI_MRU: - l->options.lcp.mru=*(u_int16_t*)data; + opt16=(struct lcp_opt16_t*)data; + l->options.lcp.neg_mru=ntohs(opt16.val); + log_debug(" <mru %i>",l->options.lcp.neg_mru); break; case CI_ASYNCMAP: + log_debug(" <asyncmap ...>"); break; - case CI_AUTHTYPE: + /*case CI_AUTHTYPE: if (l->ppp->log) log_msg("<auth "); switch(*(u_int16_t*)data) { @@ -146,10 +231,10 @@ static int lcp_recv_conf_req(struct ppp_layer_t*l,u_int8_t *data,int size) case PPP_CHAP: if (l->ppp->log) log_msg("chap"); break; - /*switch(data[4]) + switch(data[4]) { case - }*/ + } default: if (l->ppp->log) log_msg("unknown"); return -1; @@ -161,17 +246,34 @@ static int lcp_recv_conf_req(struct ppp_layer_t*l,u_int8_t *data,int size) log_error("loop detected\n"); return -1; } + break;*/ + case CI_PCOMP: + log_debug(" <pcomp>"); + if (l->options.lcp.pcomp>=1) l->options.lcp.neg_pcomp=1; + else { + l->options.lcp.neg_pcomp=-2; + ret=-1; + } + break; + case CI_ACCOMP: + log_debug(" <accomp>"); + if (l->options.lcp.accomp>=1) l->options.lcp.neg_accomp=1; + else { + l->options.lcp.neg_accomp=-2; + ret=-1; + } break; - case CI_PCOMPRESSION: - case CI_ACCOMPRESSION: } + data+=opt->len; + size-=opt->len; } - return 0; + log_debug("\n"); + return ret; } static void lcp_recv(struct ppp_layer_t*l) { - struct ppp_hdr_t *hdr; + struct lcp_hdr_t *hdr; if (l->ppp->in_buf_size-2<PPP_HEADERLEN) { @@ -179,8 +281,8 @@ static void lcp_recv(struct ppp_layer_t*l) return; } - hdr=(struct ppp_hdr_t *)(l->ppp->in_buf+2); - if (hdr->len<PPP_HEADERLEN) + hdr=(struct lcp_hdr_t *)(l->ppp->in_buf+2); + if (ntohs(hdr->len)<PPP_HEADERLEN) { log_debug("LCP: short packet received\n"); return; |