From a69ae308efe400d14ecbab676a5e7592908c6b46 Mon Sep 17 00:00:00 2001 From: Kozlov Dmitry Date: Fri, 28 Jan 2011 14:41:44 +0300 Subject: ppp: send ConfNak with random magic number if magic number in CanfReq is equal to self magic number --- accel-pppd/ppp/lcp_opt_magic.c | 56 ++++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 21 deletions(-) (limited to 'accel-pppd/ppp/lcp_opt_magic.c') 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_opt->magic); + if (ptr) + print("", ntohl(opt32->val)); + else + print("", magic_opt->magic); } static void __init magic_opt_init() -- cgit v1.2.3