summaryrefslogtreecommitdiff
path: root/accel-pppd/ppp/lcp_opt_magic.c
diff options
context:
space:
mode:
authorKozlov Dmitry <dima@server>2011-01-28 14:41:44 +0300
committerKozlov Dmitry <dima@server>2011-01-28 14:41:44 +0300
commita69ae308efe400d14ecbab676a5e7592908c6b46 (patch)
tree664b19521bc0fe81f7863aba2218ec54ba1826e2 /accel-pppd/ppp/lcp_opt_magic.c
parent673bea74d2beb8d4260355f928499230c7ff9b17 (diff)
downloadaccel-ppp-xebd-a69ae308efe400d14ecbab676a5e7592908c6b46.tar.gz
accel-ppp-xebd-a69ae308efe400d14ecbab676a5e7592908c6b46.zip
ppp: send ConfNak with random magic number if magic number in CanfReq is equal to self magic number
Diffstat (limited to 'accel-pppd/ppp/lcp_opt_magic.c')
-rw-r--r--accel-pppd/ppp/lcp_opt_magic.c56
1 files changed, 35 insertions, 21 deletions
diff --git a/accel-pppd/ppp/lcp_opt_magic.c b/accel-pppd/ppp/lcp_opt_magic.c
index 4a61ef9..6c0deb5 100644
--- a/accel-pppd/ppp/lcp_opt_magic.c
+++ b/accel-pppd/ppp/lcp_opt_magic.c
@@ -11,6 +11,7 @@
static struct lcp_option_t *magic_init(struct ppp_lcp_t *lcp);
static void magic_free(struct ppp_lcp_t *lcp, struct lcp_option_t *opt);
static int magic_send_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
+static int magic_send_conf_nak(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
static int magic_recv_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr);
static void magic_print(void (*print)(const char *fmt,...),struct lcp_option_t*, uint8_t *ptr);
@@ -22,20 +23,21 @@ struct magic_option_t
static struct lcp_option_handler_t magic_opt_hnd=
{
- .init=magic_init,
- .send_conf_req=magic_send_conf_req,
- .recv_conf_req=magic_recv_conf_req,
- .free=magic_free,
- .print=magic_print,
+ .init = magic_init,
+ .send_conf_req = magic_send_conf_req,
+ .send_conf_nak = magic_send_conf_nak,
+ .recv_conf_req = magic_recv_conf_req,
+ .free = magic_free,
+ .print = magic_print,
};
static struct lcp_option_t *magic_init(struct ppp_lcp_t *lcp)
{
- struct magic_option_t *magic_opt=_malloc(sizeof(*magic_opt));
- memset(magic_opt,0,sizeof(*magic_opt));
- magic_opt->magic=random();
- magic_opt->opt.id=CI_MAGIC;
- magic_opt->opt.len=6;
+ struct magic_option_t *magic_opt = _malloc(sizeof(*magic_opt));
+ memset(magic_opt, 0, sizeof(*magic_opt));
+ magic_opt->magic = random();
+ magic_opt->opt.id = CI_MAGIC;
+ magic_opt->opt.len = 6;
lcp->magic = magic_opt->magic;
@@ -44,7 +46,7 @@ static struct lcp_option_t *magic_init(struct ppp_lcp_t *lcp)
static void magic_free(struct ppp_lcp_t *lcp, struct lcp_option_t *opt)
{
- struct magic_option_t *magic_opt=container_of(opt,typeof(*magic_opt),opt);
+ struct magic_option_t *magic_opt = container_of(opt,typeof(*magic_opt),opt);
_free(magic_opt);
}
@@ -52,17 +54,27 @@ static void magic_free(struct ppp_lcp_t *lcp, struct lcp_option_t *opt)
static int magic_send_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr)
{
struct magic_option_t *magic_opt=container_of(opt,typeof(*magic_opt),opt);
- struct lcp_opt32_t *opt32=(struct lcp_opt32_t*)ptr;
+ struct lcp_opt32_t *opt32 = (struct lcp_opt32_t *)ptr;
opt32->hdr.id=CI_MAGIC;
opt32->hdr.len=6;
opt32->val=htonl(magic_opt->magic);
return 6;
}
-static int magic_recv_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr)
+static int magic_send_conf_nak(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr)
{
struct magic_option_t *magic_opt=container_of(opt,typeof(*magic_opt),opt);
- struct lcp_opt32_t *opt32=(struct lcp_opt32_t*)ptr;
+ struct lcp_opt32_t *opt32 = (struct lcp_opt32_t *)ptr;
+ opt32->hdr.id=CI_MAGIC;
+ opt32->hdr.len=6;
+ opt32->val=random();
+ return 6;
+}
+
+static int magic_recv_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt, uint8_t *ptr)
+{
+ struct magic_option_t *magic_opt = container_of(opt, typeof(*magic_opt), opt);
+ struct lcp_opt32_t *opt32 = (struct lcp_opt32_t *)ptr;
/*if (!ptr)
return LCP_OPT_NAK;*/
@@ -70,19 +82,21 @@ static int magic_recv_conf_req(struct ppp_lcp_t *lcp, struct lcp_option_t *opt,
if (opt32->hdr.len != 6)
return LCP_OPT_REJ;
- if (magic_opt->magic==ntohl(opt32->val))
- {
- log_ppp_error("loop detected");
- return -1;
- }
+ if (magic_opt->magic == ntohl(opt32->val))
+ return LCP_OPT_NAK;
+
return LCP_OPT_ACK;
}
static void magic_print(void (*print)(const char *fmt,...),struct lcp_option_t *opt, uint8_t *ptr)
{
- struct magic_option_t *magic_opt=container_of(opt,typeof(*magic_opt),opt);
+ struct magic_option_t *magic_opt = container_of(opt, typeof(*magic_opt), opt);
+ struct lcp_opt32_t *opt32 = (struct lcp_opt32_t *)ptr;
- print("<magic %04x>",magic_opt->magic);
+ if (ptr)
+ print("<magic %04x>", ntohl(opt32->val));
+ else
+ print("<magic %04x>", magic_opt->magic);
}
static void __init magic_opt_init()