summaryrefslogtreecommitdiff
path: root/accel-pptpd/ppp
diff options
context:
space:
mode:
authorDmitry Kozlov <xeb@mail.ru>2010-09-28 01:34:35 +0400
committerDmitry Kozlov <xeb@mail.ru>2010-09-28 01:34:35 +0400
commitea1ac5b186bd377915e9905a17b2e67df6d0bb50 (patch)
treee117543de6210c77fcd2c2cf9bb2ebb67875f3da /accel-pptpd/ppp
parentc654e2d286a10a5bca2c07f3e427f52d600717ac (diff)
downloadaccel-ppp-xebd-ea1ac5b186bd377915e9905a17b2e67df6d0bb50.tar.gz
accel-ppp-xebd-ea1ac5b186bd377915e9905a17b2e67df6d0bb50.zip
ppp: implemeted Protocol-Reject
Diffstat (limited to 'accel-pptpd/ppp')
-rw-r--r--accel-pptpd/ppp/ppp.c7
-rw-r--r--accel-pptpd/ppp/ppp.h1
-rw-r--r--accel-pptpd/ppp/ppp_lcp.c22
3 files changed, 27 insertions, 3 deletions
diff --git a/accel-pptpd/ppp/ppp.c b/accel-pptpd/ppp/ppp.c
index 03a8db0..dbb6709 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 32615c2..afc26a3 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 66d31da..c6415e9 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;