diff options
author | Kozlov Dmitry <dima@server> | 2010-08-10 17:10:57 +0400 |
---|---|---|
committer | Kozlov Dmitry <dima@server> | 2010-08-10 17:10:57 +0400 |
commit | 5286c9d19031c93a785a4d8729abf9e6a1710f98 (patch) | |
tree | bf6d60b1e8a0593afce333c80d6514d709c1151e | |
parent | 4a268755565ced740c391a4c8c7fc7c98b7fc3c7 (diff) | |
download | accel-ppp-xebd-5286c9d19031c93a785a4d8729abf9e6a1710f98.tar.gz accel-ppp-xebd-5286c9d19031c93a785a4d8729abf9e6a1710f98.zip |
working on PAP
-rw-r--r-- | accel-pptpd/auth_pap.c | 134 | ||||
-rw-r--r-- | accel-pptpd/ppp.h | 48 | ||||
-rw-r--r-- | accel-pptpd/ppp_fsm.h | 9 | ||||
-rw-r--r-- | accel-pptpd/ppp_lcp.c | 10 |
4 files changed, 160 insertions, 41 deletions
diff --git a/accel-pptpd/auth_pap.c b/accel-pptpd/auth_pap.c new file mode 100644 index 0000000..42a70f5 --- /dev/null +++ b/accel-pptpd/auth_pap.c @@ -0,0 +1,134 @@ +#include "log.h" +#include "ppp_auth.h" + +static int lcp_get_conf_req(struct auth_driver_t*, struct ppp_layer_t*, struct lcp_opt32_t*); +static int lcp_recv_conf_req(struct auth_driver_t*, struct ppp_layer_t*, struct lcp_opt32_t*); +static int lcp_conf_established(struct auth_driver_t*, struct ppp_layer_t*); +static void pap_recv(struct ppp_handler_t*h); + +struct pap_proto_t +{ + struct ppp_handler_t h; + struct ppp_t *ppp; + struct ppp_layer_t *lcp; +}; + +struct pap_hdr_t +{ + uint8_t code; + uint8_t id; + uint16_t len; +} __attribute__((packed)); + +static struct auth_driver_t pap= +{ + .type=PPP_PAP, + .get_conf_req=lcp_get_conf_req, + .recv_conf_req=lcp_recv_conf_req, + .established=lcp_established, +}; + + +int plugin_init(void) +{ + if (auth_register(&pap)) + { + log_error("pap: failed to register driver\n"); + return -1; + } + + return 0; +} + +static int lcp_established(struct auth_driver_t*d, struct ppp_layer_t*lcp) +{ + struct pap_proto_t *p=malloc(sizeof(*l)); + + memset(&p,0,sizeof(*l)); + p->h.proto=PPP_PAP; + p->h.recv=pap_recv; + p->ppp=lcp->ppp; + p->lcp=lcp; + + ppp_register_handler(p->ppp,p->h); +} + +static int lcp_get_conf_req(struct auth_driver_t*, struct ppp_layer_t*, struct lcp_opt32_t*) +{ +} + +static int lcp_recv_conf_req(struct auth_driver_t*, struct ppp_layer_t*, struct lcp_opt32_t*) +{ +} + +static void pap_send_nack(struct pap_proto_t *p,struct pap_hdr_t *hdr) +{ + +} + +static int pap_recv_req(struct pap_proto_t *p,struct pap_hdr_t *hdr) +{ + int ret; + char *peer_id; + char *passwd; + int peer_id_len; + int passwd_len; + uint8_t *ptr=(uint8_t*)(hdr+1); + + peer_id_len=*(uint8_t*)ptr; ptr++; + if (peer_id_len>htons(hdr->len)-sizeof(*hdr)-1) + { + log_warn("PAP: short packet received\n"); + return -1; + } + peer_id=ptr; ptr+=peer_id_len; + + passwd_len=*(uint8_t*)ptr; ptr++; + if (passwd_len>htons(hdr->len)-sizeof(*hdr)-2-peer_id_len) + { + log_warn("PAP: short packet received\n"); + return -1; + } + + peer_id=stdndup(peer_id,peer_id_len); + passwd=stdndup(ptr,passwd_len); + + if (pwdb_check(peer_id,passwd)) + { + log_warn("PAP: authentication error\n"); + pap_send_nack(p,hdr); + ret=-1; + }else ret=0; + + free(peer_id); + free(passwd); + + pap_send_ack(p,hdr); + return 0; +} + +static void pap_recv(struct ppp_handler_t*h) +{ + struct pap_proto_t *p=container_of(h,typeof(*p),h); + struct pap_hdr_t *hdr; + + if (p->ppp->in_buf_size<sizeof(*hdr)+2 || htons(hdr->len)<sizeof(*hdr) || htons(hdr->len)<p->ppp->in_buf_size-2) + { + log_warn("PAP: short packet received\n"); + return; + } + + hdr=(struct pap_hdr_t *)p->ppp->in_buf; + if (ntohs(hdr->len)<sizeof(*hdr) ||) + { + log_warn("PAP: short packet received\n"); + return; + } + + if (hdr->code==PAP_REQ) pap_recv_req(p,hdr); + else + { + log_warn("PAP: unknown code received %x\n",hdr->code); + } +} + diff --git a/accel-pptpd/ppp.h b/accel-pptpd/ppp.h index 13e6934..a48f00d 100644 --- a/accel-pptpd/ppp.h +++ b/accel-pptpd/ppp.h @@ -72,40 +72,13 @@ struct ppp_t struct list_head layers; }; -struct ppp_fsm_handler_t +struct ppp_handler_t { - void (*reset_conf)(struct ppp_t *ppp); /* Reset our Configuration Information */ - int (*conf_length)(struct ppp_t *ppp); /* Length of our Configuration Information */ - void (*add_conf)(struct ppp_t *ppp, unsigned char *, int *); /* Add our Configuration Information */ - int (*ack_conf)(struct ppp_t *ppp, unsigned char *,int); /* ACK our Configuration Information */ - int (*nak_conf)(struct ppp_t *ppp, unsigned char *,int,int); /* NAK our Configuration Information */ - int (*rej_conf)(struct ppp_t *ppp, unsigned char *,int); /* Reject our Configuration Information */ - int (*req_conf)(struct ppp_t *ppp, unsigned char *,int *,int); /* Request peer's Configuration Information */ - void (*opened)(struct ppp_t *ppp); /* Called when fsm reaches OPENED state */ - void (*down)(struct ppp_t *ppp); /* Called when fsm leaves OPENED state */ - void (*starting)(struct ppp_t *ppp); /* Called when we want the lower layer */ - void (*finished)(struct ppp_t *ppp); /* Called when we don't want the lower layer */ - void (*protreject)(struct ppp_t *ppp,int); /* Called when Protocol-Reject received */ - void (*retransmit)(struct ppp_t *ppp); /* Retransmission is necessary */ - int (*extcode)(struct ppp_t *ppp, int, int, unsigned char *, int); /* Called when unknown code received */ - char *proto_name; /* String name for protocol (for messages) */ + struct list_head entry; + int proto; + void (*recv)(struct ppp_handler_t*); }; -struct ppp_hdr_t -{ - u_int8_t code; - u_int8_t id; - u_int16_t len; - u_int8_t data[100]; -}__attribute__((packed)); - -struct ppp_opt_t -{ - u_int8_t type; - u_int16_t len; - u_int8_t data[100]; -}__attribute__((packed)); - struct ppp_t *alloc_ppp(void); int establish_ppp(struct ppp_t *ppp); int ppp_send(struct ppp_t *ppp, void *data, int size); @@ -114,4 +87,17 @@ void ppp_init(void); struct ppp_layer_t* ppp_lcp_init(struct ppp_t *ppp); + +#undef offsetof +#ifdef __compiler_offsetof +#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER) +#else +#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) +#endif +#endif /* __KERNEL__ */ + +#define container_of(ptr, type, member) ({ \ + const typeof( ((type *)0)->member ) *__mptr = (ptr); \ + (type *)( (char *)__mptr - offsetof(type,member) );}) + #endif diff --git a/accel-pptpd/ppp_fsm.h b/accel-pptpd/ppp_fsm.h index 6b19bf7..3e1eded 100644 --- a/accel-pptpd/ppp_fsm.h +++ b/accel-pptpd/ppp_fsm.h @@ -38,18 +38,14 @@ struct lcp_options_t struct ppp_layer_t { - struct list_head entry; - struct ppp_layer_t *lower; - struct ppp_layer_t *upper; - - int proto; + struct ppp_handler_t h; struct ppp_t *ppp; FSM_STATE fsm_state; union { struct lcp_options_t lcp; - }options; + } options; struct triton_timer_t restart_timer; int restart_counter; @@ -74,7 +70,6 @@ struct ppp_layer_t void (*send_conf_ack)(struct ppp_layer_t*); void (*send_conf_nak)(struct ppp_layer_t*); void (*send_conf_rej)(struct ppp_layer_t*); - void (*recv)(struct ppp_layer_t*); }; void ppp_fsm_init(struct ppp_layer_t*); diff --git a/accel-pptpd/ppp_lcp.c b/accel-pptpd/ppp_lcp.c index dc996e0..50ad444 100644 --- a/accel-pptpd/ppp_lcp.c +++ b/accel-pptpd/ppp_lcp.c @@ -31,11 +31,12 @@ struct ppp_layer_t* ppp_lcp_init(struct ppp_t *ppp) struct ppp_layer_t *layer=malloc(sizeof(*layer)); memset(layer,0,sizeof(*layer)); - layer->proto=PPP_LCP; + layer->h.proto=PPP_LCP; + layer->h.recv=lcp_recv; + layer->ppp=ppp; ppp_fsm_init(layer); - layer->recv=lcp_recv; layer->send_conf_req=send_conf_req; layer->send_conf_ack=send_conf_ack; layer->send_conf_nak=send_conf_nak; @@ -43,6 +44,8 @@ struct ppp_layer_t* ppp_lcp_init(struct ppp_t *ppp) ppp_fsm_init(layer); + ppp_register_handler(&layer->h); + return layer; } @@ -324,9 +327,10 @@ void send_echo_reply(struct ppp_layer_t *layer) ppp_send(layer->ppp,&msg,msg.hdr.len+2); } -static void lcp_recv(struct ppp_layer_t*l) +static void lcp_recv(struct ppp_handler_t*h) { struct lcp_hdr_t *hdr; + struct ppp_layer_t *l=container_of(h,typeof(*l),h); if (l->ppp->in_buf_size<PPP_HEADERLEN+2) { |