summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--accel-pptpd/auth_pap.c134
-rw-r--r--accel-pptpd/ppp.h48
-rw-r--r--accel-pptpd/ppp_fsm.h9
-rw-r--r--accel-pptpd/ppp_lcp.c10
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)
{