diff options
author | Dmitry Kozlov <xeb@mail.ru> | 2010-09-28 01:34:35 +0400 |
---|---|---|
committer | Dmitry Kozlov <xeb@mail.ru> | 2010-09-28 01:34:35 +0400 |
commit | ea1ac5b186bd377915e9905a17b2e67df6d0bb50 (patch) | |
tree | e117543de6210c77fcd2c2cf9bb2ebb67875f3da | |
parent | c654e2d286a10a5bca2c07f3e427f52d600717ac (diff) | |
download | accel-ppp-ea1ac5b186bd377915e9905a17b2e67df6d0bb50.tar.gz accel-ppp-ea1ac5b186bd377915e9905a17b2e67df6d0bb50.zip |
ppp: implemeted Protocol-Reject
-rw-r--r-- | accel-pptpd/logs/log_file.c | 4 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.c | 7 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp.h | 1 | ||||
-rw-r--r-- | accel-pptpd/ppp/ppp_lcp.c | 22 |
4 files changed, 29 insertions, 5 deletions
diff --git a/accel-pptpd/logs/log_file.c b/accel-pptpd/logs/log_file.c index 1c1538ca..be615ad8 100644 --- a/accel-pptpd/logs/log_file.c +++ b/accel-pptpd/logs/log_file.c @@ -36,14 +36,14 @@ struct log_file_t int fd; int new_fd; off_t offset; - uint64_t magic; + unsigned long magic; }; struct log_file_pd_t { struct ppp_pd_t pd; struct log_file_t lf; - uint64_t tmp; + unsigned long tmp; }; static int conf_color; diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c index 03a8db08..dbb6709d 100644 --- a/accel-pptpd/ppp/ppp.c +++ b/accel-pptpd/ppp/ppp.c @@ -274,7 +274,8 @@ cont: } } - log_ppp_warn("ppp_chan_read: discarding unknown packet %x\n", proto); + lcp_send_proto_rej(ppp, proto); + //log_ppp_warn("ppp_chan_read: discarding unknown packet %x\n", proto); } } @@ -316,8 +317,8 @@ cont: goto cont; } } - - log_ppp_warn("ppp_unit_read: discarding unknown packet %x\n",proto); + lcp_send_proto_rej(ppp, proto); + //log_ppp_warn("ppp_unit_read: discarding unknown packet %x\n", proto); } } diff --git a/accel-pptpd/ppp/ppp.h b/accel-pptpd/ppp/ppp.h index 32615c2e..afc26a3c 100644 --- a/accel-pptpd/ppp/ppp.h +++ b/accel-pptpd/ppp/ppp.h @@ -136,6 +136,7 @@ void ppp_init(struct ppp_t *ppp); int establish_ppp(struct ppp_t *ppp); int ppp_chan_send(struct ppp_t *ppp, void *data, int size); int ppp_unit_send(struct ppp_t *ppp, void *data, int size); +void lcp_send_proto_rej(struct ppp_t *ppp, uint16_t proto); struct ppp_fsm_t* ppp_lcp_init(struct ppp_t *ppp); void ppp_layer_started(struct ppp_t *ppp,struct ppp_layer_data_t*); diff --git a/accel-pptpd/ppp/ppp_lcp.c b/accel-pptpd/ppp/ppp_lcp.c index 66d31da8..c6415e9f 100644 --- a/accel-pptpd/ppp/ppp_lcp.c +++ b/accel-pptpd/ppp/ppp_lcp.c @@ -26,6 +26,7 @@ static int conf_echo_interval = 0; static int conf_echo_failure = 3; static LIST_HEAD(option_handlers); +static struct ppp_layer_t lcp_layer; static void lcp_layer_up(struct ppp_fsm_t*); static void lcp_layer_down(struct ppp_fsm_t*); @@ -616,6 +617,27 @@ static void send_term_ack(struct ppp_fsm_t *fsm) ppp_chan_send(lcp->ppp, &hdr, 6); } +void lcp_send_proto_rej(struct ppp_t *ppp, uint16_t proto) +{ + struct ppp_lcp_t *lcp = container_of(ppp_find_layer_data(ppp, &lcp_layer), typeof(*lcp), ld); + struct rej_msg_t + { + struct lcp_hdr_t hdr; + uint16_t proto; + } __attribute__((packed)) msg = { + .hdr.proto = htons(PPP_LCP), + .hdr.code = PROTOREJ, + .hdr.id = ++lcp->fsm.id, + .hdr.len = htons(6), + .proto = proto, + }; + + log_ppp_debug("send [LCP ProtoRej id=%i <%x>]\n", msg.hdr.id, proto); + + ppp_chan_send(lcp->ppp, &msg, sizeof(msg)); +} + + static void lcp_recv(struct ppp_handler_t*h) { struct lcp_hdr_t *hdr; |