if_pppoe.c revision 1.157
1/* $NetBSD: if_pppoe.c,v 1.157 2020/11/25 10:39:47 yamaguchi Exp $ */ 2 3/* 4 * Copyright (c) 2002, 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Martin Husemann <martin@NetBSD.org>. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <sys/cdefs.h> 33__KERNEL_RCSID(0, "$NetBSD: if_pppoe.c,v 1.157 2020/11/25 10:39:47 yamaguchi Exp $"); 34 35#ifdef _KERNEL_OPT 36#include "pppoe.h" 37#include "opt_pppoe.h" 38#include "opt_net_mpsafe.h" 39#endif 40 41#include <sys/param.h> 42#include <sys/systm.h> 43#include <sys/kernel.h> 44#include <sys/atomic.h> 45#include <sys/callout.h> 46#include <sys/malloc.h> 47#include <sys/mbuf.h> 48#include <sys/socket.h> 49#include <sys/proc.h> 50#include <sys/ioctl.h> 51#include <sys/kauth.h> 52#include <sys/intr.h> 53#include <sys/socketvar.h> 54#include <sys/device.h> 55#include <sys/module.h> 56#include <sys/sysctl.h> 57#include <sys/rwlock.h> 58#include <sys/mutex.h> 59#include <sys/psref.h> 60#include <sys/cprng.h> 61#include <sys/workqueue.h> 62 63#include <net/if.h> 64#include <net/if_types.h> 65#include <net/if_ether.h> 66#include <net/if_sppp.h> 67#include <net/if_spppvar.h> 68#include <net/if_pppoe.h> 69#include <net/if_dl.h> 70 71#include <net/bpf.h> 72 73#include "ioconf.h" 74 75#ifdef NET_MPSAFE 76#define PPPOE_MPSAFE 1 77#endif 78 79struct pppoehdr { 80 uint8_t vertype; 81 uint8_t code; 82 uint16_t session; 83 uint16_t plen; 84} __packed; 85 86struct pppoetag { 87 uint16_t tag; 88 uint16_t len; 89} __packed; 90 91#define PPPOE_HEADERLEN sizeof(struct pppoehdr) 92#define PPPOE_OVERHEAD (PPPOE_HEADERLEN + 2) 93#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ 94 95#define PPPOE_TAG_EOL 0x0000 /* end of list */ 96#define PPPOE_TAG_SNAME 0x0101 /* service name */ 97#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ 98#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ 99#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ 100#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ 101#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ 102#define PPPOE_TAG_MAX_PAYLOAD 0x0120 /* max payload */ 103#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ 104#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ 105#define PPPOE_TAG_GENERIC_ERR 0x0203 /* generic error */ 106 107#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ 108#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ 109#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ 110#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ 111#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ 112 113/* two byte PPP protocol discriminator, then IP data */ 114#define PPPOE_MAXMTU (ETHERMTU - PPPOE_OVERHEAD) 115 116/* Add a 16 bit unsigned value to a buffer pointed to by PTR */ 117#define PPPOE_ADD_16(PTR, VAL) \ 118 *(PTR)++ = (VAL) / 256; \ 119 *(PTR)++ = (VAL) % 256 120 121/* Add a complete PPPoE header to the buffer pointed to by PTR */ 122#define PPPOE_ADD_HEADER(PTR, CODE, SESS, LEN) \ 123 *(PTR)++ = PPPOE_VERTYPE; \ 124 *(PTR)++ = (CODE); \ 125 PPPOE_ADD_16(PTR, SESS); \ 126 PPPOE_ADD_16(PTR, LEN) 127 128#define PPPOE_DISC_TIMEOUT (hz*5) /* base for quick timeout calculation */ 129#define PPPOE_SLOW_RETRY (hz*60) /* persistent retry interval */ 130#define PPPOE_RECON_FAST (hz*15) /* first retry after auth failure */ 131#define PPPOE_RECON_IMMEDIATE (hz/10) /* "no delay" reconnect */ 132#define PPPOE_DISC_MAXPADI 4 /* retry PADI four times (quickly) */ 133#define PPPOE_DISC_MAXPADR 2 /* retry PADR twice */ 134 135#ifdef PPPOE_SERVER 136/* from if_spppsubr.c */ 137#define IFF_PASSIVE IFF_LINK0 /* wait passively for connection */ 138#endif 139 140#define PPPOE_LOCK(_sc, _op) rw_enter(&(_sc)->sc_lock, (_op)) 141#define PPPOE_UNLOCK(_sc) rw_exit(&(_sc)->sc_lock) 142#define PPPOE_WLOCKED(_sc) rw_write_held(&(_sc)->sc_lock) 143 144#ifdef PPPOE_MPSAFE 145#define DECLARE_SPLNET_VARIABLE 146#define ACQUIRE_SPLNET() do { } while (0) 147#define RELEASE_SPLNET() do { } while (0) 148#else 149#define DECLARE_SPLNET_VARIABLE int __s 150#define ACQUIRE_SPLNET() do { \ 151 __s = splnet(); \ 152 } while (0) 153#define RELEASE_SPLNET() do { \ 154 splx(__s); \ 155 } while (0) 156#endif 157 158#ifdef PPPOE_DEBUG 159#define DPRINTF(_sc, _fmt, _arg...) pppoe_printf((_sc), (_fmt), ##_arg) 160#else 161#define DPRINTF(_sc, _fmt, _arg...) __nothing 162#endif 163 164struct pppoe_softc { 165 struct sppp sc_sppp; /* contains a struct ifnet as first element */ 166 LIST_ENTRY(pppoe_softc) sc_list; 167 struct ifnet *sc_eth_if; /* ethernet interface we are using */ 168 169 uint64_t sc_id; /* id of this softc, our hunique */ 170 int sc_state; /* discovery phase or session connected */ 171 struct ether_addr sc_dest; /* hardware address of concentrator */ 172 uint16_t sc_session; /* PPPoE session id */ 173 174 char *sc_service_name; /* if != NULL: requested name of service */ 175 char *sc_concentrator_name; /* if != NULL: requested concentrator id */ 176 uint8_t *sc_ac_cookie; /* content of AC cookie we must echo back */ 177 size_t sc_ac_cookie_len; /* length of cookie data */ 178 uint8_t *sc_relay_sid; /* content of relay SID we must echo back */ 179 size_t sc_relay_sid_len; /* length of relay SID data */ 180#ifdef PPPOE_SERVER 181 uint8_t *sc_hunique; /* content of host unique we must echo back */ 182 size_t sc_hunique_len; /* length of host unique */ 183#endif 184 callout_t sc_timeout; /* timeout while not in session state */ 185 struct workqueue *sc_timeout_wq; /* workqueue for timeout */ 186 struct work sc_timeout_wk; 187 u_int sc_timeout_scheduled; 188 int sc_padi_retried; /* number of PADI retries already done */ 189 int sc_padr_retried; /* number of PADR retries already done */ 190 krwlock_t sc_lock; /* lock of sc_state, sc_session, and sc_eth_if */ 191}; 192 193/* incoming traffic will be queued here */ 194struct ifqueue ppoediscinq = { .ifq_maxlen = IFQ_MAXLEN }; 195struct ifqueue ppoeinq = { .ifq_maxlen = IFQ_MAXLEN }; 196 197void *pppoe_softintr = NULL; 198static void pppoe_softintr_handler(void *); 199 200extern int sppp_ioctl(struct ifnet *, unsigned long, void *); 201 202/* input routines */ 203static void pppoeintr(void); 204static void pppoe_disc_input(struct mbuf *); 205static void pppoe_dispatch_disc_pkt(struct mbuf *, int); 206static void pppoe_data_input(struct mbuf *); 207static void pppoe_enqueue(struct ifqueue *, struct mbuf *); 208 209/* management routines */ 210static int pppoe_connect(struct pppoe_softc *); 211static int pppoe_disconnect(struct pppoe_softc *); 212static void pppoe_abort_connect(struct pppoe_softc *); 213static int pppoe_ioctl(struct ifnet *, unsigned long, void *); 214static void pppoe_tls(struct sppp *); 215static void pppoe_tlf(struct sppp *); 216static void pppoe_start(struct ifnet *); 217#ifdef PPPOE_MPSAFE 218static int pppoe_transmit(struct ifnet *, struct mbuf *); 219#endif 220static void pppoe_clear_softc(struct pppoe_softc *, const char *); 221static void pppoe_printf(struct pppoe_softc *, const char *, ...); 222 223/* internal timeout handling */ 224static void pppoe_timeout_co(void *); 225static void pppoe_timeout_co_halt(void *); 226static void pppoe_timeout_wk(struct work *, void *); 227static void pppoe_timeout(struct pppoe_softc *); 228 229/* sending actual protocol controll packets */ 230static int pppoe_send_padi(struct pppoe_softc *); 231static int pppoe_send_padr(struct pppoe_softc *); 232#ifdef PPPOE_SERVER 233static int pppoe_send_pado(struct pppoe_softc *); 234static int pppoe_send_pads(struct pppoe_softc *); 235#endif 236static int pppoe_send_padt(struct ifnet *, u_int, const uint8_t *); 237 238/* raw output */ 239static int pppoe_output(struct pppoe_softc *, struct mbuf *); 240 241/* internal helper functions */ 242static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct ifnet *, 243 krw_t); 244static struct pppoe_softc * pppoe_find_softc_by_hunique(uint8_t *, size_t, 245 struct ifnet *, krw_t); 246static struct mbuf *pppoe_get_mbuf(size_t len); 247 248static void pppoe_ifattach_hook(void *, unsigned long, void *); 249 250static LIST_HEAD(pppoe_softc_head, pppoe_softc) pppoe_softc_list; 251static krwlock_t pppoe_softc_list_lock; 252 253static int pppoe_clone_create(struct if_clone *, int); 254static int pppoe_clone_destroy(struct ifnet *); 255 256static bool pppoe_term_unknown = false; 257static int pppoe_term_unknown_pps = 1; 258 259static struct sysctllog *pppoe_sysctl_clog; 260static void sysctl_net_pppoe_setup(struct sysctllog **); 261 262static struct if_clone pppoe_cloner = 263 IF_CLONE_INITIALIZER("pppoe", pppoe_clone_create, pppoe_clone_destroy); 264 265/* ARGSUSED */ 266void 267pppoeattach(int count) 268{ 269 270 /* 271 * Nothing to do here, initialization is handled by the 272 * module initialization code in pppoeinit() below). 273 */ 274} 275 276static void 277pppoeinit(void) 278{ 279 280 LIST_INIT(&pppoe_softc_list); 281 rw_init(&pppoe_softc_list_lock); 282 if_clone_attach(&pppoe_cloner); 283 284 pppoe_softintr = softint_establish(SOFTINT_MPSAFE|SOFTINT_NET, 285 pppoe_softintr_handler, NULL); 286 sysctl_net_pppoe_setup(&pppoe_sysctl_clog); 287 288 IFQ_LOCK_INIT(&ppoediscinq); 289 IFQ_LOCK_INIT(&ppoeinq); 290} 291 292static int 293pppoedetach(void) 294{ 295 int error = 0; 296 297 rw_enter(&pppoe_softc_list_lock, RW_READER); 298 if (!LIST_EMPTY(&pppoe_softc_list)) { 299 rw_exit(&pppoe_softc_list_lock); 300 error = EBUSY; 301 } 302 303 if (error == 0) { 304 if_clone_detach(&pppoe_cloner); 305 softint_disestablish(pppoe_softintr); 306 /* Remove our sysctl sub-tree */ 307 sysctl_teardown(&pppoe_sysctl_clog); 308 } 309 310 return error; 311} 312 313static void 314pppoe_softc_genid(uint64_t *id) 315{ 316 struct pppoe_softc *sc; 317 uint64_t rndid; 318 319 rw_enter(&pppoe_softc_list_lock, RW_READER); 320 321 while (1) { 322 rndid = cprng_strong64(); 323 324 sc = NULL; 325 LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { 326 if (sc->sc_id == rndid) 327 break; 328 } 329 if (sc == NULL) { 330 break; 331 } 332 } 333 334 rw_exit(&pppoe_softc_list_lock); 335 *id = rndid; 336} 337 338static int 339pppoe_clone_create(struct if_clone *ifc, int unit) 340{ 341 struct pppoe_softc *sc; 342 int rv; 343 344 sc = malloc(sizeof(struct pppoe_softc), M_DEVBUF, M_WAITOK|M_ZERO); 345 346 pppoe_softc_genid(&sc->sc_id); 347 348 if_initname(&sc->sc_sppp.pp_if, "pppoe", unit); 349 sc->sc_sppp.pp_if.if_softc = sc; 350 sc->sc_sppp.pp_if.if_mtu = PPPOE_MAXMTU; 351 sc->sc_sppp.pp_if.if_flags = IFF_SIMPLEX|IFF_POINTOPOINT|IFF_MULTICAST; 352#ifdef PPPOE_MPSAFE 353 sc->sc_sppp.pp_if.if_extflags = IFEF_MPSAFE; 354#endif 355 sc->sc_sppp.pp_if.if_type = IFT_PPP; 356 sc->sc_sppp.pp_if.if_hdrlen = sizeof(struct ether_header) + PPPOE_HEADERLEN; 357 sc->sc_sppp.pp_if.if_dlt = DLT_PPP_ETHER; 358 sc->sc_sppp.pp_flags |= PP_KEEPALIVE | /* use LCP keepalive */ 359 PP_NOFRAMING; /* no serial encapsulation */ 360 sc->sc_sppp.pp_if.if_ioctl = pppoe_ioctl; 361 IFQ_SET_MAXLEN(&sc->sc_sppp.pp_if.if_snd, IFQ_MAXLEN); 362 IFQ_SET_READY(&sc->sc_sppp.pp_if.if_snd); 363 364 /* changed to real address later */ 365 memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); 366 367 rv = workqueue_create(&sc->sc_timeout_wq, 368 sc->sc_sppp.pp_if.if_xname, pppoe_timeout_wk, sc, 369 PRI_SOFTNET, IPL_SOFTNET, 0); 370 if (rv != 0) { 371 free(sc, M_DEVBUF); 372 return rv; 373 } 374 375 callout_init(&sc->sc_timeout, CALLOUT_MPSAFE); 376 callout_setfunc(&sc->sc_timeout, pppoe_timeout_co, sc); 377 378 sc->sc_sppp.pp_if.if_start = pppoe_start; 379#ifdef PPPOE_MPSAFE 380 sc->sc_sppp.pp_if.if_transmit = pppoe_transmit; 381#endif 382 sc->sc_sppp.pp_tls = pppoe_tls; 383 sc->sc_sppp.pp_tlf = pppoe_tlf; 384 sc->sc_sppp.pp_framebytes = PPPOE_HEADERLEN; /* framing added to ppp packets */ 385 386 rv = if_initialize(&sc->sc_sppp.pp_if); 387 if (rv != 0) { 388 workqueue_destroy(sc->sc_timeout_wq); 389 callout_halt(&sc->sc_timeout, NULL); 390 callout_destroy(&sc->sc_timeout); 391 free(sc, M_DEVBUF); 392 return rv; 393 } 394 sc->sc_sppp.pp_if.if_percpuq = if_percpuq_create(&sc->sc_sppp.pp_if); 395 sppp_attach(&sc->sc_sppp.pp_if); 396 397 bpf_attach(&sc->sc_sppp.pp_if, DLT_PPP_ETHER, 0); 398 rw_enter(&pppoe_softc_list_lock, RW_READER); 399 if (LIST_EMPTY(&pppoe_softc_list)) { 400 pfil_add_ihook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil); 401 } 402 rw_exit(&pppoe_softc_list_lock); 403 404 if_register(&sc->sc_sppp.pp_if); 405 406 rw_init(&sc->sc_lock); 407 408 rw_enter(&pppoe_softc_list_lock, RW_WRITER); 409 LIST_INSERT_HEAD(&pppoe_softc_list, sc, sc_list); 410 rw_exit(&pppoe_softc_list_lock); 411 return 0; 412} 413 414static int 415pppoe_clone_destroy(struct ifnet *ifp) 416{ 417 struct pppoe_softc * sc = ifp->if_softc; 418 419 rw_enter(&pppoe_softc_list_lock, RW_WRITER); 420 421 PPPOE_LOCK(sc, RW_WRITER); 422 callout_setfunc(&sc->sc_timeout, pppoe_timeout_co_halt, sc); 423 workqueue_wait(sc->sc_timeout_wq, &sc->sc_timeout_wk); 424 callout_halt(&sc->sc_timeout, NULL); 425 426 LIST_REMOVE(sc, sc_list); 427 428 if (LIST_EMPTY(&pppoe_softc_list)) { 429 pfil_remove_ihook(pppoe_ifattach_hook, NULL, PFIL_IFNET, if_pfil); 430 } 431 rw_exit(&pppoe_softc_list_lock); 432 433 bpf_detach(ifp); 434 sppp_detach(&sc->sc_sppp.pp_if); 435 if_detach(ifp); 436 if (sc->sc_concentrator_name) 437 free(sc->sc_concentrator_name, M_DEVBUF); 438 if (sc->sc_service_name) 439 free(sc->sc_service_name, M_DEVBUF); 440 if (sc->sc_ac_cookie) 441 free(sc->sc_ac_cookie, M_DEVBUF); 442 if (sc->sc_relay_sid) 443 free(sc->sc_relay_sid, M_DEVBUF); 444 callout_destroy(&sc->sc_timeout); 445 workqueue_destroy(sc->sc_timeout_wq); 446 447 PPPOE_UNLOCK(sc); 448 rw_destroy(&sc->sc_lock); 449 450 free(sc, M_DEVBUF); 451 452 return 0; 453} 454 455static void 456pppoe_printf(struct pppoe_softc *sc, const char *fmt, ...) 457{ 458 va_list ap; 459 bool pppoe_debug; 460 461#ifdef PPPOE_DEBUG 462 pppoe_debug = true; 463#else 464 pppoe_debug = false; 465#endif 466 467 if (sc == NULL) { 468 if (!pppoe_debug) 469 return; 470 471 printf("pppoe: "); 472 } else { 473 if (!ISSET(sc->sc_sppp.pp_if.if_flags, IFF_DEBUG)) 474 return; 475 476 printf("%s: ", sc->sc_sppp.pp_if.if_xname); 477 } 478 479 va_start(ap, fmt); 480 vprintf(fmt, ap); 481 va_end(ap); 482} 483 484/* 485 * Find the interface handling the specified session. 486 * Note: O(number of sessions open), this is a client-side only, mean 487 * and lean implementation, so number of open sessions typically should 488 * be 1. 489 */ 490static struct pppoe_softc * 491pppoe_find_softc_by_session(u_int session, struct ifnet *rcvif, krw_t lock) 492{ 493 struct pppoe_softc *sc = NULL; 494 495 if (session == 0) 496 return NULL; 497 rw_enter(&pppoe_softc_list_lock, RW_READER); 498 LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { 499 PPPOE_LOCK(sc, lock); 500 if ( sc->sc_state == PPPOE_STATE_SESSION 501 && sc->sc_session == session 502 && sc->sc_eth_if == rcvif) 503 break; 504 505 PPPOE_UNLOCK(sc); 506 } 507 rw_exit(&pppoe_softc_list_lock); 508 return sc; 509} 510 511/* Check host unique token passed and return appropriate softc pointer, 512 * or NULL if token is bogus. */ 513static struct pppoe_softc * 514pppoe_find_softc_by_hunique(uint8_t *token, size_t len, 515 struct ifnet *rcvif, krw_t lock) 516{ 517 struct pppoe_softc *sc; 518 uint64_t t; 519 520 CTASSERT(sizeof(t) == sizeof(sc->sc_id)); 521 522 rw_enter(&pppoe_softc_list_lock, RW_READER); 523 if (LIST_EMPTY(&pppoe_softc_list)) { 524 rw_exit(&pppoe_softc_list_lock); 525 return NULL; 526 } 527 528 if (len != sizeof(sc->sc_id)) { 529 rw_exit(&pppoe_softc_list_lock); 530 return NULL; 531 } 532 memcpy(&t, token, len); 533 534 LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { 535 if (sc->sc_id == t) { 536 PPPOE_LOCK(sc, lock); 537 break; 538 } 539 } 540 rw_exit(&pppoe_softc_list_lock); 541 542 if (sc == NULL) { 543 pppoe_printf(NULL, "alien host unique tag" 544 ", no session found\n"); 545 return NULL; 546 } 547 548 /* should be safe to access *sc now */ 549 if (sc->sc_state < PPPOE_STATE_PADI_SENT || sc->sc_state >= PPPOE_STATE_SESSION) { 550 pppoe_printf(sc, "host unique tag found" 551 ", but it belongs to a connection in state %d\n", 552 sc->sc_state); 553 PPPOE_UNLOCK(sc); 554 return NULL; 555 } 556 if (sc->sc_eth_if != rcvif) { 557 pppoe_printf(sc, "wrong interface, not accepting host unique\n"); 558 PPPOE_UNLOCK(sc); 559 return NULL; 560 } 561 return sc; 562} 563 564static void 565pppoe_softintr_handler(void *dummy) 566{ 567 /* called at splsoftnet() */ 568 pppoeintr(); 569} 570 571/* called at appropriate protection level */ 572static void 573pppoeintr(void) 574{ 575 struct mbuf *m; 576 int disc_done, data_done; 577 578 SOFTNET_LOCK_UNLESS_NET_MPSAFE(); 579 580 do { 581 disc_done = 0; 582 data_done = 0; 583 for (;;) { 584 IFQ_LOCK(&ppoediscinq); 585 IF_DEQUEUE(&ppoediscinq, m); 586 IFQ_UNLOCK(&ppoediscinq); 587 if (m == NULL) 588 break; 589 disc_done = 1; 590 pppoe_disc_input(m); 591 } 592 593 for (;;) { 594 IFQ_LOCK(&ppoeinq); 595 IF_DEQUEUE(&ppoeinq, m); 596 IFQ_UNLOCK(&ppoeinq); 597 if (m == NULL) 598 break; 599 data_done = 1; 600 pppoe_data_input(m); 601 } 602 } while (disc_done || data_done); 603 604 SOFTNET_UNLOCK_UNLESS_NET_MPSAFE(); 605} 606 607/* analyze and handle a single received packet while not in session state */ 608static void 609pppoe_dispatch_disc_pkt(struct mbuf *m, int off) 610{ 611 uint16_t tag, len; 612 uint16_t session, plen; 613 struct pppoe_softc *sc; 614 const char *err_msg; 615 char *error; 616 size_t dlen; 617 uint8_t *ac_cookie; 618 size_t ac_cookie_len; 619 uint8_t *relay_sid; 620 size_t relay_sid_len; 621 uint8_t *hunique; 622 size_t hunique_len; 623 struct pppoehdr *ph; 624 struct pppoetag *pt; 625 struct mbuf *n; 626 int noff, err, errortag; 627 struct ether_header *eh; 628 struct ifnet *rcvif; 629 struct psref psref; 630 631 if (m->m_len < sizeof(*eh)) { 632 m = m_pullup(m, sizeof(*eh)); 633 if (m == NULL) 634 goto done; 635 } 636 eh = mtod(m, struct ether_header *); 637 off += sizeof(*eh); 638 639 if (m->m_pkthdr.len - off <= PPPOE_HEADERLEN) { 640 goto done; 641 } 642 643 M_REGION_GET(ph, struct pppoehdr *, m, off, sizeof(*ph)); 644 if (ph == NULL) { 645 goto done; 646 } 647 if (ph->vertype != PPPOE_VERTYPE) { 648 goto done; 649 } 650 651 ac_cookie = NULL; 652 ac_cookie_len = 0; 653 relay_sid = NULL; 654 relay_sid_len = 0; 655 hunique = NULL; 656 hunique_len = 0; 657 658 session = ntohs(ph->session); 659 plen = ntohs(ph->plen); 660 off += sizeof(*ph); 661 662 if (plen + off > m->m_pkthdr.len) { 663 goto done; 664 } 665 m_adj(m, off + plen - m->m_pkthdr.len); /* ignore trailing garbage */ 666 667 tag = 0; 668 len = 0; 669 sc = NULL; 670 err_msg = NULL; 671 errortag = 0; 672 while (off + sizeof(*pt) <= m->m_pkthdr.len) { 673 M_REGION_GET(pt, struct pppoetag *, m, off, sizeof(*pt)); 674 if (pt == NULL) { 675 goto done; 676 } 677 678 tag = ntohs(pt->tag); 679 len = ntohs(pt->len); 680 if (off + len + sizeof(*pt) > m->m_pkthdr.len) { 681 goto done; 682 } 683 switch (tag) { 684 case PPPOE_TAG_EOL: 685 goto breakbreak; 686 case PPPOE_TAG_SNAME: 687 break; /* ignored */ 688 case PPPOE_TAG_ACNAME: 689 if (len > 0) { 690 dlen = 4 * len + 1; 691 error = malloc(dlen, M_TEMP, M_NOWAIT); 692 if (error == NULL) 693 break; 694 695 n = m_pulldown(m, off + sizeof(*pt), len, 696 &noff); 697 if (!n) { 698 m = NULL; 699 free(error, M_TEMP); 700 goto done; 701 } 702 703 strnvisx(error, dlen, 704 mtod(n, char*) + noff, len, 705 VIS_SAFE | VIS_OCTAL); 706 pppoe_printf(NULL, "connected to %s\n", error); 707 free(error, M_TEMP); 708 } 709 break; /* ignored */ 710 case PPPOE_TAG_HUNIQUE: 711 if (hunique == NULL) { 712 n = m_pulldown(m, off + sizeof(*pt), len, 713 &noff); 714 if (!n) { 715 m = NULL; 716 err_msg = "TAG HUNIQUE ERROR"; 717 break; 718 } 719 720 hunique = mtod(n, uint8_t *) + noff; 721 hunique_len = len; 722 } 723 break; 724 case PPPOE_TAG_ACCOOKIE: 725 if (ac_cookie == NULL) { 726 n = m_pulldown(m, off + sizeof(*pt), len, 727 &noff); 728 if (!n) { 729 err_msg = "TAG ACCOOKIE ERROR"; 730 m = NULL; 731 break; 732 } 733 ac_cookie = mtod(n, char *) + noff; 734 ac_cookie_len = len; 735 } 736 break; 737 case PPPOE_TAG_RELAYSID: 738 if (relay_sid == NULL) { 739 n = m_pulldown(m, off + sizeof(*pt), len, 740 &noff); 741 if (!n) { 742 err_msg = "TAG RELAYSID ERROR"; 743 m = NULL; 744 break; 745 } 746 relay_sid = mtod(n, char *) + noff; 747 relay_sid_len = len; 748 } 749 break; 750 case PPPOE_TAG_SNAME_ERR: 751 err_msg = "SERVICE NAME ERROR"; 752 errortag = 1; 753 break; 754 case PPPOE_TAG_ACSYS_ERR: 755 err_msg = "AC SYSTEM ERROR"; 756 errortag = 1; 757 break; 758 case PPPOE_TAG_GENERIC_ERR: 759 err_msg = "GENERIC ERROR"; 760 errortag = 1; 761 break; 762 } 763 if (err_msg) { 764 error = NULL; 765 if (errortag && len) { 766 dlen = 4 * len + 1; 767 error = malloc(dlen, M_TEMP, 768 M_NOWAIT|M_ZERO); 769 n = m_pulldown(m, off + sizeof(*pt), len, 770 &noff); 771 if (!n) { 772 m = NULL; 773 } else if (error) { 774 strnvisx(error, dlen, 775 mtod(n, char*) + noff, len, 776 VIS_SAFE | VIS_OCTAL); 777 } 778 } 779 if (error) { 780 pppoe_printf(NULL, "%s: %s\n", err_msg, error); 781 free(error, M_TEMP); 782 } else 783 pppoe_printf(NULL, "%s\n", err_msg); 784 if (errortag || m == NULL) 785 goto done; 786 } 787 off += sizeof(*pt) + len; 788 } 789breakbreak:; 790 791 switch (ph->code) { 792 case PPPOE_CODE_PADI: 793#ifdef PPPOE_SERVER 794 /* 795 * got service name, concentrator name, and/or host unique. 796 * ignore if we have no interfaces with IFF_PASSIVE|IFF_UP. 797 */ 798 rw_enter(&pppoe_softc_list_lock, RW_READER); 799 if (LIST_EMPTY(&pppoe_softc_list)) { 800 rw_exit(&pppoe_softc_list_lock); 801 goto done; 802 } 803 804 LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { 805 PPPOE_LOCK(sc, RW_WRITER); 806 if (!(sc->sc_sppp.pp_if.if_flags & IFF_UP)) { 807 PPPOE_UNLOCK(sc); 808 continue; 809 } 810 if (!(sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) { 811 PPPOE_UNLOCK(sc); 812 continue; 813 } 814 815 if (sc->sc_state == PPPOE_STATE_INITIAL) 816 break; 817 818 PPPOE_UNLOCK(sc); 819 } 820 rw_exit(&pppoe_softc_list_lock); 821 822 if (sc == NULL) { 823 goto done; 824 } 825 826 if (hunique) { 827 if (sc->sc_hunique) 828 free(sc->sc_hunique, M_DEVBUF); 829 sc->sc_hunique = malloc(hunique_len, M_DEVBUF, 830 M_DONTWAIT); 831 if (sc->sc_hunique == NULL) { 832 PPPOE_UNLOCK(sc); 833 goto done; 834 } 835 sc->sc_hunique_len = hunique_len; 836 memcpy(sc->sc_hunique, hunique, hunique_len); 837 } 838 memcpy(&sc->sc_dest, eh->ether_shost, sizeof sc->sc_dest); 839 sc->sc_state = PPPOE_STATE_PADO_SENT; 840 pppoe_send_pado(sc); 841 PPPOE_UNLOCK(sc); 842 break; 843#endif /* PPPOE_SERVER */ 844 845 case PPPOE_CODE_PADR: 846#ifdef PPPOE_SERVER 847 /* 848 * get sc from ac_cookie if IFF_PASSIVE 849 */ 850 if (ac_cookie == NULL) { 851 goto done; 852 } 853 854 rcvif = m_get_rcvif_psref(m, &psref); 855 if (__predict_true(rcvif != NULL)) { 856 sc = pppoe_find_softc_by_hunique(ac_cookie, 857 ac_cookie_len, rcvif, RW_WRITER); 858 } 859 m_put_rcvif_psref(rcvif, &psref); 860 if (sc == NULL) { 861 /* be quiet if there is not a single pppoe instance */ 862 rw_enter(&pppoe_softc_list_lock, RW_READER); 863 if (!LIST_EMPTY(&pppoe_softc_list)) { 864 pppoe_printf(NULL, "received PADR" 865 " but could not find request for it\n"); 866 } 867 rw_exit(&pppoe_softc_list_lock); 868 goto done; 869 } 870 871 if (sc->sc_state != PPPOE_STATE_PADO_SENT) { 872 pppoe_printf(sc, "received unexpected PADR\n"); 873 PPPOE_UNLOCK(sc); 874 goto done; 875 } 876 877 if (hunique) { 878 if (sc->sc_hunique) 879 free(sc->sc_hunique, M_DEVBUF); 880 sc->sc_hunique = malloc(hunique_len, M_DEVBUF, 881 M_DONTWAIT); 882 if (sc->sc_hunique == NULL) { 883 PPPOE_UNLOCK(sc); 884 goto done; 885 } 886 sc->sc_hunique_len = hunique_len; 887 memcpy(sc->sc_hunique, hunique, hunique_len); 888 } 889 pppoe_send_pads(sc); 890 sc->sc_state = PPPOE_STATE_SESSION; 891 PPPOE_UNLOCK(sc); 892 893 sc->sc_sppp.pp_up(&sc->sc_sppp); 894 break; 895#else 896 /* ignore, we are no access concentrator */ 897 goto done; 898#endif /* PPPOE_SERVER */ 899 900 case PPPOE_CODE_PADO: 901 rcvif = m_get_rcvif_psref(m, &psref); 902 if (__predict_false(rcvif == NULL)) 903 goto done; 904 905 if (hunique != NULL) { 906 sc = pppoe_find_softc_by_hunique(hunique, 907 hunique_len, rcvif, RW_WRITER); 908 } 909 910 m_put_rcvif_psref(rcvif, &psref); 911 912 if (sc == NULL) { 913 /* be quiet if there is not a single pppoe instance */ 914 rw_enter(&pppoe_softc_list_lock, RW_READER); 915 if (!LIST_EMPTY(&pppoe_softc_list)) { 916 pppoe_printf(NULL, "received PADO" 917 " but could not find request for it\n"); 918 } 919 rw_exit(&pppoe_softc_list_lock); 920 goto done; 921 } 922 923 if (sc->sc_state != PPPOE_STATE_PADI_SENT) { 924 pppoe_printf(sc, "received unexpected PADO\n"); 925 PPPOE_UNLOCK(sc); 926 goto done; 927 } 928 929 if (ac_cookie) { 930 if (sc->sc_ac_cookie) 931 free(sc->sc_ac_cookie, M_DEVBUF); 932 sc->sc_ac_cookie = malloc(ac_cookie_len, M_DEVBUF, 933 M_DONTWAIT); 934 if (sc->sc_ac_cookie == NULL) { 935 pppoe_printf(sc, "FATAL: could not allocate memory " 936 "for AC cookie\n"); 937 PPPOE_UNLOCK(sc); 938 goto done; 939 } 940 sc->sc_ac_cookie_len = ac_cookie_len; 941 memcpy(sc->sc_ac_cookie, ac_cookie, ac_cookie_len); 942 } 943 if (relay_sid) { 944 if (sc->sc_relay_sid) 945 free(sc->sc_relay_sid, M_DEVBUF); 946 sc->sc_relay_sid = malloc(relay_sid_len, M_DEVBUF, 947 M_DONTWAIT); 948 if (sc->sc_relay_sid == NULL) { 949 pppoe_printf(sc, "FATAL: could not allocate memory " 950 "for relay SID\n"); 951 PPPOE_UNLOCK(sc); 952 goto done; 953 } 954 sc->sc_relay_sid_len = relay_sid_len; 955 memcpy(sc->sc_relay_sid, relay_sid, relay_sid_len); 956 } 957 memcpy(&sc->sc_dest, eh->ether_shost, sizeof sc->sc_dest); 958 callout_stop(&sc->sc_timeout); 959 sc->sc_padr_retried = 0; 960 sc->sc_state = PPPOE_STATE_PADR_SENT; 961 if ((err = pppoe_send_padr(sc)) != 0) { 962 pppoe_printf(sc, 963 "failed to send PADR, error=%d\n", err); 964 } 965 callout_schedule(&sc->sc_timeout, 966 PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried)); 967 968 PPPOE_UNLOCK(sc); 969 break; 970 971 case PPPOE_CODE_PADS: 972 rcvif = m_get_rcvif_psref(m, &psref); 973 if (__predict_false(rcvif == NULL)) 974 goto done; 975 976 if (hunique != NULL) { 977 sc = pppoe_find_softc_by_hunique(hunique, 978 hunique_len, rcvif, RW_WRITER); 979 } 980 981 m_put_rcvif_psref(rcvif, &psref); 982 983 if (sc == NULL) 984 goto done; 985 986 sc->sc_session = session; 987 callout_stop(&sc->sc_timeout); 988 pppoe_printf(sc, "session 0x%x connected\n", session); 989 sc->sc_state = PPPOE_STATE_SESSION; 990 PPPOE_UNLOCK(sc); 991 992 sc->sc_sppp.pp_up(&sc->sc_sppp); /* notify upper layers */ 993 break; 994 995 case PPPOE_CODE_PADT: 996 rcvif = m_get_rcvif_psref(m, &psref); 997 if (__predict_false(rcvif == NULL)) 998 goto done; 999 1000 sc = pppoe_find_softc_by_session(session, rcvif, 1001 RW_WRITER); 1002 1003 m_put_rcvif_psref(rcvif, &psref); 1004 1005 if (sc == NULL) 1006 goto done; 1007 1008 pppoe_clear_softc(sc, "received PADT"); 1009 PPPOE_UNLOCK(sc); 1010 break; 1011 1012 default: 1013 rcvif = m_get_rcvif_psref(m, &psref); 1014 if (__predict_false(rcvif == NULL)) 1015 goto done; 1016 1017 if (hunique != NULL) { 1018 sc = pppoe_find_softc_by_hunique(hunique, 1019 hunique_len, rcvif, RW_READER); 1020 } 1021 1022 m_put_rcvif_psref(rcvif, &psref); 1023 1024 pppoe_printf(sc, "unknown code (0x%04x) session = 0x%04x\n", 1025 ph->code, session); 1026 if (sc == NULL) 1027 goto done; 1028 PPPOE_UNLOCK(sc); 1029 break; 1030 } 1031 1032done: 1033 if (m) 1034 m_freem(m); 1035 return; 1036} 1037 1038static void 1039pppoe_disc_input(struct mbuf *m) 1040{ 1041 KASSERT(m->m_flags & M_PKTHDR); 1042 1043 /* 1044 * Avoid error messages if there is not a single PPPoE instance. 1045 */ 1046 rw_enter(&pppoe_softc_list_lock, RW_READER); 1047 if (!LIST_EMPTY(&pppoe_softc_list)) { 1048 rw_exit(&pppoe_softc_list_lock); 1049 pppoe_dispatch_disc_pkt(m, 0); 1050 } else { 1051 rw_exit(&pppoe_softc_list_lock); 1052 m_freem(m); 1053 } 1054} 1055 1056static bool 1057pppoe_is_my_frame(uint8_t *dhost, struct ifnet *rcvif) 1058{ 1059 1060 if (memcmp(CLLADDR(rcvif->if_sadl), dhost, ETHER_ADDR_LEN) == 0) 1061 return true; 1062 1063 return false; 1064} 1065 1066static void 1067pppoe_data_input(struct mbuf *m) 1068{ 1069 uint16_t session, plen; 1070 struct pppoe_softc *sc; 1071 struct pppoehdr *ph; 1072 struct ifnet *rcvif; 1073 struct psref psref; 1074 uint8_t shost[ETHER_ADDR_LEN]; 1075 uint8_t dhost[ETHER_ADDR_LEN]; 1076 bool term_unknown = pppoe_term_unknown; 1077 1078 KASSERT(m->m_flags & M_PKTHDR); 1079 1080 /* 1081 * Avoid error messages if there is not a single PPPoE instance. 1082 */ 1083 rw_enter(&pppoe_softc_list_lock, RW_READER); 1084 if (LIST_EMPTY(&pppoe_softc_list)) { 1085 rw_exit(&pppoe_softc_list_lock); 1086 goto drop; 1087 } 1088 rw_exit(&pppoe_softc_list_lock); 1089 1090 if (term_unknown) { 1091 memcpy(shost, mtod(m, struct ether_header*)->ether_shost, 1092 ETHER_ADDR_LEN); 1093 memcpy(dhost, mtod(m, struct ether_header*)->ether_dhost, 1094 ETHER_ADDR_LEN); 1095 } 1096 m_adj(m, sizeof(struct ether_header)); 1097 if (m->m_pkthdr.len <= PPPOE_HEADERLEN) { 1098 goto drop; 1099 } 1100 1101 if (m->m_len < sizeof(*ph)) { 1102 m = m_pullup(m, sizeof(*ph)); 1103 if (m == NULL) { 1104 return; 1105 } 1106 } 1107 ph = mtod(m, struct pppoehdr *); 1108 1109 if (ph->vertype != PPPOE_VERTYPE) { 1110 goto drop; 1111 } 1112 if (ph->code != 0) { 1113 goto drop; 1114 } 1115 1116 session = ntohs(ph->session); 1117 rcvif = m_get_rcvif_psref(m, &psref); 1118 if (__predict_false(rcvif == NULL)) 1119 goto drop; 1120 sc = pppoe_find_softc_by_session(session, rcvif, RW_READER); 1121 if (sc == NULL) { 1122 if (term_unknown) { 1123 static struct timeval lasttime = {0, 0}; 1124 static int curpps = 0; 1125 /* 1126 * avoid to send wrong PADT which is response from 1127 * session stage packets for other hosts when parent 1128 * ethernet is promiscuous mode. 1129 */ 1130 if (pppoe_is_my_frame(dhost, rcvif) && 1131 ppsratecheck(&lasttime, &curpps, 1132 pppoe_term_unknown_pps)) { 1133 pppoe_printf(NULL, "input for unknown session %#x, " 1134 "sending PADT\n", session); 1135 pppoe_send_padt(rcvif, session, shost); 1136 } 1137 } 1138 m_put_rcvif_psref(rcvif, &psref); 1139 goto drop; 1140 } 1141 1142 m_put_rcvif_psref(rcvif, &psref); 1143 1144 plen = ntohs(ph->plen); 1145 1146 bpf_mtap(&sc->sc_sppp.pp_if, m, BPF_D_IN); 1147 1148 m_adj(m, PPPOE_HEADERLEN); 1149 1150#ifdef PPPOE_DEBUG 1151 { 1152 struct mbuf *p; 1153 1154 printf("%s: pkthdr.len=%d, pppoe.len=%d", 1155 sc->sc_sppp.pp_if.if_xname, m->m_pkthdr.len, plen); 1156 p = m; 1157 while (p) { 1158 printf(" l=%d", p->m_len); 1159 p = p->m_next; 1160 } 1161 printf("\n"); 1162 } 1163#endif 1164 PPPOE_UNLOCK(sc); 1165 1166 if (m->m_pkthdr.len < plen) 1167 goto drop; 1168 1169 /* ignore trailing garbage */ 1170 m_adj(m, plen - m->m_pkthdr.len); 1171 /* 1172 * Fix incoming interface pointer (not the raw ethernet interface 1173 * anymore) 1174 */ 1175 m_set_rcvif(m, &sc->sc_sppp.pp_if); 1176 1177 /* pass packet up and account for it */ 1178 if_statinc(&sc->sc_sppp.pp_if, if_ipackets); 1179 sppp_input(&sc->sc_sppp.pp_if, m); 1180 return; 1181 1182drop: 1183 m_freem(m); 1184} 1185 1186static int 1187pppoe_output(struct pppoe_softc *sc, struct mbuf *m) 1188{ 1189 struct sockaddr dst; 1190 struct ether_header *eh; 1191 uint16_t etype; 1192 1193 if (sc->sc_eth_if == NULL) { 1194 m_freem(m); 1195 return EIO; 1196 } 1197 1198 memset(&dst, 0, sizeof dst); 1199 dst.sa_family = AF_UNSPEC; 1200 eh = (struct ether_header*)&dst.sa_data; 1201 etype = sc->sc_state == PPPOE_STATE_SESSION 1202 ? ETHERTYPE_PPPOE : ETHERTYPE_PPPOEDISC; 1203 eh->ether_type = htons(etype); 1204 memcpy(&eh->ether_dhost, &sc->sc_dest, sizeof sc->sc_dest); 1205 1206 DPRINTF(sc, "(%x) state=%d, session=0x%x output -> %s, len=%d\n", 1207 etype, sc->sc_state, sc->sc_session, 1208 ether_sprintf((const unsigned char *)&sc->sc_dest), m->m_pkthdr.len); 1209 1210 m->m_flags &= ~(M_BCAST|M_MCAST); 1211 if_statinc(&sc->sc_sppp.pp_if, if_opackets); 1212 return if_output_lock(sc->sc_eth_if, sc->sc_eth_if, m, &dst, NULL); 1213} 1214 1215static int 1216pppoe_parm_cpyinstr(struct pppoe_softc *sc, 1217 char **dst, const void *src, size_t len) 1218{ 1219 int error = 0; 1220 char *next = NULL; 1221 size_t bufsiz, cpysiz, strsiz; 1222 1223 bufsiz = len + 1; 1224 1225 if (src == NULL) 1226 goto out; 1227 1228 bufsiz = len + 1; 1229 next = malloc(bufsiz, M_DEVBUF, M_WAITOK); 1230 if (next == NULL) 1231 return ENOMEM; 1232 1233 error = copyinstr(src, next, bufsiz, &cpysiz); 1234 if (error != 0) 1235 goto fail; 1236 if (cpysiz != bufsiz) { 1237 error = EINVAL; 1238 goto fail; 1239 } 1240 1241 strsiz = strnlen(next, bufsiz); 1242 if (strsiz == bufsiz) { 1243 error = EINVAL; 1244 goto fail; 1245 } 1246 1247out: 1248 PPPOE_LOCK(sc, RW_WRITER); 1249 if (*dst != NULL) 1250 free(*dst, M_DEVBUF); 1251 *dst = next; 1252 next = NULL; 1253 PPPOE_UNLOCK(sc); 1254fail: 1255 if (next != NULL) 1256 free(next, M_DEVBUF); 1257 1258 return error; 1259} 1260 1261static int 1262pppoe_ioctl(struct ifnet *ifp, unsigned long cmd, void *data) 1263{ 1264 struct lwp *l = curlwp; /* XXX */ 1265 struct pppoe_softc *sc = (struct pppoe_softc*)ifp; 1266 struct ifreq *ifr = data; 1267 int error = 0; 1268 1269 switch (cmd) { 1270 case PPPOESETPARMS: 1271 { 1272 struct pppoediscparms *parms = (struct pppoediscparms*)data; 1273 if (kauth_authorize_network(l->l_cred, KAUTH_NETWORK_INTERFACE, 1274 KAUTH_REQ_NETWORK_INTERFACE_SETPRIV, ifp, (void *)cmd, 1275 NULL) != 0) 1276 return EPERM; 1277 if (parms->eth_ifname[0] != 0) { 1278 struct ifnet *eth_if; 1279 1280 PPPOE_LOCK(sc, RW_WRITER); 1281 eth_if = ifunit(parms->eth_ifname); 1282 if (eth_if == NULL || eth_if->if_dlt != DLT_EN10MB) { 1283 sc->sc_eth_if = NULL; 1284 PPPOE_UNLOCK(sc); 1285 return ENXIO; 1286 } 1287 1288 if (sc->sc_sppp.pp_if.if_mtu != 1289 eth_if->if_mtu - PPPOE_OVERHEAD) { 1290 sc->sc_sppp.pp_if.if_mtu = eth_if->if_mtu - 1291 PPPOE_OVERHEAD; 1292 } 1293 sc->sc_eth_if = eth_if; 1294 PPPOE_UNLOCK(sc); 1295 } 1296 1297 error = pppoe_parm_cpyinstr(sc, &sc->sc_concentrator_name, 1298 parms->ac_name, parms->ac_name_len); 1299 if (error != 0) 1300 return error; 1301 1302 error = pppoe_parm_cpyinstr(sc, &sc->sc_service_name, 1303 parms->service_name, parms->service_name_len); 1304 if (error != 0) 1305 return error; 1306 return 0; 1307 } 1308 break; 1309 case PPPOEGETPARMS: 1310 { 1311 struct pppoediscparms *parms = (struct pppoediscparms*)data; 1312 memset(parms, 0, sizeof *parms); 1313 PPPOE_LOCK(sc, RW_READER); 1314 if (sc->sc_eth_if) 1315 strlcpy(parms->ifname, sc->sc_eth_if->if_xname, 1316 sizeof(parms->ifname)); 1317 PPPOE_UNLOCK(sc); 1318 return 0; 1319 } 1320 break; 1321 case PPPOEGETSESSION: 1322 { 1323 struct pppoeconnectionstate *state = (struct pppoeconnectionstate*)data; 1324 PPPOE_LOCK(sc, RW_READER); 1325 state->state = sc->sc_state; 1326 state->session_id = sc->sc_session; 1327 state->padi_retry_no = sc->sc_padi_retried; 1328 state->padr_retry_no = sc->sc_padr_retried; 1329 PPPOE_UNLOCK(sc); 1330 return 0; 1331 } 1332 break; 1333 case SIOCSIFFLAGS: 1334 /* 1335 * Prevent running re-establishment timers overriding 1336 * administrators choice. 1337 */ 1338 PPPOE_LOCK(sc, RW_WRITER); 1339 1340 if ((ifr->ifr_flags & IFF_UP) == 0 1341 && sc->sc_state < PPPOE_STATE_SESSION) { 1342 callout_stop(&sc->sc_timeout); 1343 sc->sc_state = PPPOE_STATE_INITIAL; 1344 sc->sc_padi_retried = 0; 1345 sc->sc_padr_retried = 0; 1346 memcpy(&sc->sc_dest, etherbroadcastaddr, 1347 sizeof(sc->sc_dest)); 1348 } 1349 1350 PPPOE_UNLOCK(sc); 1351 1352 error = sppp_ioctl(ifp, cmd, data); 1353 1354 return error; 1355 case SIOCSIFMTU: 1356 if (ifr->ifr_mtu > (sc->sc_eth_if == NULL ? 1357 PPPOE_MAXMTU : (sc->sc_eth_if->if_mtu - PPPOE_OVERHEAD))) { 1358 return EINVAL; 1359 } 1360 /*FALLTHROUGH*/ 1361 default: 1362 return sppp_ioctl(ifp, cmd, data); 1363 } 1364 return 0; 1365} 1366 1367/* 1368 * Allocate a mbuf/cluster with space to store the given data length 1369 * of payload, leaving space for prepending an ethernet header 1370 * in front. 1371 */ 1372static struct mbuf * 1373pppoe_get_mbuf(size_t len) 1374{ 1375 struct mbuf *m; 1376 1377 MGETHDR(m, M_DONTWAIT, MT_DATA); 1378 if (m == NULL) 1379 return NULL; 1380 if (len + sizeof(struct ether_header) > MHLEN) { 1381 MCLGET(m, M_DONTWAIT); 1382 if ((m->m_flags & M_EXT) == 0) { 1383 m_free(m); 1384 return NULL; 1385 } 1386 } 1387 m->m_data += sizeof(struct ether_header); 1388 m->m_len = len; 1389 m->m_pkthdr.len = len; 1390 m_reset_rcvif(m); 1391 1392 return m; 1393} 1394 1395static int 1396pppoe_send_padi(struct pppoe_softc *sc) 1397{ 1398 struct mbuf *m0; 1399 int len, l1 = 0, l2 = 0; 1400 uint8_t *p; 1401 1402 if (sc->sc_state > PPPOE_STATE_PADI_SENT) 1403 panic("pppoe_send_padi in state %d", sc->sc_state); 1404 1405 /* Compute packet length. */ 1406 len = sizeof(struct pppoetag); 1407 if (sc->sc_service_name != NULL) { 1408 l1 = strlen(sc->sc_service_name); 1409 len += l1; 1410 } 1411 if (sc->sc_concentrator_name != NULL) { 1412 l2 = strlen(sc->sc_concentrator_name); 1413 len += sizeof(struct pppoetag) + l2; 1414 } 1415 len += sizeof(struct pppoetag) + sizeof(sc->sc_id); 1416 if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) { 1417 len += sizeof(struct pppoetag) + 2; 1418 } 1419 1420 /* Allocate packet. */ 1421 m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN); 1422 if (m0 == NULL) 1423 return ENOBUFS; 1424 1425 /* Fill in packet. */ 1426 p = mtod(m0, uint8_t *); 1427 PPPOE_ADD_HEADER(p, PPPOE_CODE_PADI, 0, len); 1428 PPPOE_ADD_16(p, PPPOE_TAG_SNAME); 1429 if (sc->sc_service_name != NULL) { 1430 PPPOE_ADD_16(p, l1); 1431 memcpy(p, sc->sc_service_name, l1); 1432 p += l1; 1433 } else { 1434 PPPOE_ADD_16(p, 0); 1435 } 1436 if (sc->sc_concentrator_name != NULL) { 1437 PPPOE_ADD_16(p, PPPOE_TAG_ACNAME); 1438 PPPOE_ADD_16(p, l2); 1439 memcpy(p, sc->sc_concentrator_name, l2); 1440 p += l2; 1441 } 1442 PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); 1443 PPPOE_ADD_16(p, sizeof(sc->sc_id)); 1444 memcpy(p, &sc->sc_id, sizeof(sc->sc_id)); 1445 p += sizeof(sc->sc_id); 1446 1447 if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) { 1448 PPPOE_ADD_16(p, PPPOE_TAG_MAX_PAYLOAD); 1449 PPPOE_ADD_16(p, 2); 1450 PPPOE_ADD_16(p, (uint16_t)sc->sc_sppp.pp_if.if_mtu); 1451 } 1452 1453#ifdef PPPOE_DEBUG 1454 if (p - mtod(m0, uint8_t *) != len + PPPOE_HEADERLEN) 1455 panic("pppoe_send_padi: garbled output len, should be %ld, is %ld", 1456 (long)(len + PPPOE_HEADERLEN), (long)(p - mtod(m0, uint8_t *))); 1457#endif 1458 1459 /* Send packet. */ 1460 return pppoe_output(sc, m0); 1461} 1462 1463static void 1464pppoe_timeout_co(void *arg) 1465{ 1466 struct pppoe_softc *sc = (struct pppoe_softc *)arg; 1467 1468 if (atomic_swap_uint(&sc->sc_timeout_scheduled, 1) != 0) 1469 return; 1470 1471 workqueue_enqueue(sc->sc_timeout_wq, &sc->sc_timeout_wk, NULL); 1472} 1473 1474static void 1475pppoe_timeout_co_halt(void *unused __unused) 1476{ 1477 1478 /* do nothing to halt callout safely */ 1479} 1480 1481static void 1482pppoe_timeout_wk(struct work *wk __unused, void *arg) 1483{ 1484 struct pppoe_softc *sc = (struct pppoe_softc *)arg; 1485 1486 atomic_swap_uint(&sc->sc_timeout_scheduled, 0); 1487 pppoe_timeout(sc); 1488} 1489 1490static void 1491pppoe_timeout(struct pppoe_softc *sc) 1492{ 1493 int retry_wait, err; 1494 DECLARE_SPLNET_VARIABLE; 1495 1496 pppoe_printf(sc, "timeout\n"); 1497 1498 PPPOE_LOCK(sc, RW_WRITER); 1499 switch (sc->sc_state) { 1500 case PPPOE_STATE_INITIAL: 1501 /* delayed connect from pppoe_tls() */ 1502 pppoe_connect(sc); 1503 break; 1504 case PPPOE_STATE_PADI_SENT: 1505 /* 1506 * We have two basic ways of retrying: 1507 * - Quick retry mode: try a few times in short sequence 1508 * - Slow retry mode: we already had a connection successfully 1509 * established and will try infinitely (without user 1510 * intervention) 1511 * We only enter slow retry mode if IFF_LINK1 (aka autodial) 1512 * is not set. 1513 */ 1514 1515 /* initialize for quick retry mode */ 1516 retry_wait = PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried); 1517 1518 ACQUIRE_SPLNET(); 1519 sc->sc_padi_retried++; 1520 if (sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) { 1521 if ((sc->sc_sppp.pp_if.if_flags & IFF_LINK1) == 0) { 1522 /* slow retry mode */ 1523 retry_wait = PPPOE_SLOW_RETRY; 1524 } else { 1525 pppoe_abort_connect(sc); 1526 RELEASE_SPLNET(); 1527 PPPOE_UNLOCK(sc); 1528 return; 1529 } 1530 } 1531 if ((err = pppoe_send_padi(sc)) != 0) { 1532 sc->sc_padi_retried--; 1533 pppoe_printf(sc, 1534 "failed to transmit PADI, error=%d\n", err); 1535 } 1536 callout_schedule(&sc->sc_timeout,retry_wait); 1537 RELEASE_SPLNET(); 1538 break; 1539 1540 case PPPOE_STATE_PADR_SENT: 1541 ACQUIRE_SPLNET(); 1542 sc->sc_padr_retried++; 1543 if (sc->sc_padr_retried >= PPPOE_DISC_MAXPADR) { 1544 memcpy(&sc->sc_dest, etherbroadcastaddr, 1545 sizeof(sc->sc_dest)); 1546 sc->sc_state = PPPOE_STATE_PADI_SENT; 1547 sc->sc_padr_retried = 0; 1548 if ((err = pppoe_send_padi(sc)) != 0) { 1549 pppoe_printf(sc, 1550 "failed to send PADI, error=%d\n", err); 1551 } 1552 callout_schedule(&sc->sc_timeout, 1553 PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried)); 1554 RELEASE_SPLNET(); 1555 PPPOE_UNLOCK(sc); 1556 return; 1557 } 1558 if ((err = pppoe_send_padr(sc)) != 0) { 1559 sc->sc_padr_retried--; 1560 pppoe_printf(sc,"failed to send PADR, error=%d", err); 1561 } 1562 callout_schedule(&sc->sc_timeout, 1563 PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried)); 1564 RELEASE_SPLNET(); 1565 break; 1566 case PPPOE_STATE_CLOSING: 1567 pppoe_disconnect(sc); 1568 break; 1569 default: 1570 PPPOE_UNLOCK(sc); 1571 return; /* all done, work in peace */ 1572 } 1573 PPPOE_UNLOCK(sc); 1574} 1575 1576/* Start a connection (i.e. initiate discovery phase) */ 1577static int 1578pppoe_connect(struct pppoe_softc *sc) 1579{ 1580 int err; 1581 DECLARE_SPLNET_VARIABLE; 1582 1583 KASSERT(PPPOE_WLOCKED(sc)); 1584 1585 if (sc->sc_state != PPPOE_STATE_INITIAL) 1586 return EBUSY; 1587 1588#ifdef PPPOE_SERVER 1589 /* wait PADI if IFF_PASSIVE */ 1590 if ((sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) 1591 return 0; 1592#endif 1593 ACQUIRE_SPLNET(); 1594 /* save state, in case we fail to send PADI */ 1595 sc->sc_state = PPPOE_STATE_PADI_SENT; 1596 sc->sc_padr_retried = 0; 1597 err = pppoe_send_padi(sc); 1598 if (err != 0) 1599 pppoe_printf(sc, "failed to send PADI, error=%d\n", err); 1600 callout_schedule(&sc->sc_timeout, PPPOE_DISC_TIMEOUT); 1601 RELEASE_SPLNET(); 1602 return err; 1603} 1604 1605/* disconnect */ 1606static int 1607pppoe_disconnect(struct pppoe_softc *sc) 1608{ 1609 int err; 1610 DECLARE_SPLNET_VARIABLE; 1611 1612 KASSERT(PPPOE_WLOCKED(sc)); 1613 1614 ACQUIRE_SPLNET(); 1615 1616 if (sc->sc_state < PPPOE_STATE_SESSION) 1617 err = EBUSY; 1618 else { 1619 pppoe_printf(sc, "disconnecting\n"); 1620 err = pppoe_send_padt(sc->sc_eth_if, sc->sc_session, 1621 (const uint8_t *)&sc->sc_dest); 1622 } 1623 1624 /* cleanup softc */ 1625 sc->sc_state = PPPOE_STATE_INITIAL; 1626 1627 memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); 1628 if (sc->sc_ac_cookie) { 1629 free(sc->sc_ac_cookie, M_DEVBUF); 1630 sc->sc_ac_cookie = NULL; 1631 } 1632 sc->sc_ac_cookie_len = 0; 1633 if (sc->sc_relay_sid) { 1634 free(sc->sc_relay_sid, M_DEVBUF); 1635 sc->sc_relay_sid = NULL; 1636 } 1637 sc->sc_relay_sid_len = 0; 1638#ifdef PPPOE_SERVER 1639 if (sc->sc_hunique) { 1640 free(sc->sc_hunique, M_DEVBUF); 1641 sc->sc_hunique = NULL; 1642 } 1643 sc->sc_hunique_len = 0; 1644#endif 1645 sc->sc_session = 0; 1646 1647 PPPOE_UNLOCK(sc); 1648 1649 /* notify upper layer */ 1650 sc->sc_sppp.pp_down(&sc->sc_sppp); 1651 1652 PPPOE_LOCK(sc, RW_WRITER); 1653 1654 RELEASE_SPLNET(); 1655 return err; 1656} 1657 1658/* Connection attempt aborted */ 1659static void 1660pppoe_abort_connect(struct pppoe_softc *sc) 1661{ 1662 KASSERT(PPPOE_WLOCKED(sc)); 1663 1664 pppoe_printf(sc, "could not establish connection\n"); 1665 sc->sc_state = PPPOE_STATE_CLOSING; 1666 1667 PPPOE_UNLOCK(sc); 1668 1669 /* notify upper layer */ 1670 sc->sc_sppp.pp_down(&sc->sc_sppp); 1671 1672 PPPOE_LOCK(sc, RW_WRITER); 1673 1674 /* clear connection state */ 1675 memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); 1676 sc->sc_state = PPPOE_STATE_INITIAL; 1677} 1678 1679static int 1680pppoe_send_padr(struct pppoe_softc *sc) 1681{ 1682 struct mbuf *m0; 1683 uint8_t *p; 1684 size_t len, l1 = 0; 1685 1686 if (sc->sc_state != PPPOE_STATE_PADR_SENT) 1687 return EIO; 1688 1689 /* Compute packet length. */ 1690 len = sizeof(struct pppoetag); 1691 if (sc->sc_service_name != NULL) { 1692 l1 = strlen(sc->sc_service_name); 1693 len += l1; 1694 } 1695 if (sc->sc_ac_cookie_len > 0) { 1696 len += sizeof(struct pppoetag) + sc->sc_ac_cookie_len; 1697 } 1698 if (sc->sc_relay_sid_len > 0) { 1699 len += sizeof(struct pppoetag) + sc->sc_relay_sid_len; 1700 } 1701 len += sizeof(struct pppoetag) + sizeof(sc->sc_id); 1702 if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) { 1703 len += sizeof(struct pppoetag) + 2; 1704 } 1705 1706 /* Allocate packet. */ 1707 m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN); 1708 if (m0 == NULL) 1709 return ENOBUFS; 1710 1711 /* Fill in packet. */ 1712 p = mtod(m0, uint8_t *); 1713 PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len); 1714 PPPOE_ADD_16(p, PPPOE_TAG_SNAME); 1715 if (sc->sc_service_name != NULL) { 1716 PPPOE_ADD_16(p, l1); 1717 memcpy(p, sc->sc_service_name, l1); 1718 p += l1; 1719 } else { 1720 PPPOE_ADD_16(p, 0); 1721 } 1722 if (sc->sc_ac_cookie_len > 0) { 1723 PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE); 1724 PPPOE_ADD_16(p, sc->sc_ac_cookie_len); 1725 memcpy(p, sc->sc_ac_cookie, sc->sc_ac_cookie_len); 1726 p += sc->sc_ac_cookie_len; 1727 } 1728 if (sc->sc_relay_sid_len > 0) { 1729 PPPOE_ADD_16(p, PPPOE_TAG_RELAYSID); 1730 PPPOE_ADD_16(p, sc->sc_relay_sid_len); 1731 memcpy(p, sc->sc_relay_sid, sc->sc_relay_sid_len); 1732 p += sc->sc_relay_sid_len; 1733 } 1734 PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); 1735 PPPOE_ADD_16(p, sizeof(sc->sc_id)); 1736 memcpy(p, &sc->sc_id, sizeof(sc->sc_id)); 1737 p += sizeof(sc->sc_id); 1738 1739 if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) { 1740 PPPOE_ADD_16(p, PPPOE_TAG_MAX_PAYLOAD); 1741 PPPOE_ADD_16(p, 2); 1742 PPPOE_ADD_16(p, (uint16_t)sc->sc_sppp.pp_if.if_mtu); 1743 } 1744 1745#ifdef PPPOE_DEBUG 1746 if (p - mtod(m0, uint8_t *) != len + PPPOE_HEADERLEN) 1747 panic("pppoe_send_padr: garbled output len, should be %ld, is %ld", 1748 (long)(len + PPPOE_HEADERLEN), (long)(p - mtod(m0, uint8_t *))); 1749#endif 1750 1751 /* Send packet. */ 1752 return pppoe_output(sc, m0); 1753} 1754 1755/* send a PADT packet */ 1756static int 1757pppoe_send_padt(struct ifnet *outgoing_if, u_int session, const uint8_t *dest) 1758{ 1759 struct ether_header *eh; 1760 struct sockaddr dst; 1761 struct mbuf *m0; 1762 uint8_t *p; 1763 1764 m0 = pppoe_get_mbuf(PPPOE_HEADERLEN); 1765 if (!m0) 1766 return EIO; 1767 p = mtod(m0, uint8_t *); 1768 PPPOE_ADD_HEADER(p, PPPOE_CODE_PADT, session, 0); 1769 1770 memset(&dst, 0, sizeof dst); 1771 dst.sa_family = AF_UNSPEC; 1772 eh = (struct ether_header*)&dst.sa_data; 1773 eh->ether_type = htons(ETHERTYPE_PPPOEDISC); 1774 memcpy(&eh->ether_dhost, dest, ETHER_ADDR_LEN); 1775 1776 m0->m_flags &= ~(M_BCAST|M_MCAST); 1777 return if_output_lock(outgoing_if, outgoing_if, m0, &dst, NULL); 1778} 1779 1780#ifdef PPPOE_SERVER 1781static int 1782pppoe_send_pado(struct pppoe_softc *sc) 1783{ 1784 struct mbuf *m0; 1785 uint8_t *p; 1786 size_t len; 1787 1788 if (sc->sc_state != PPPOE_STATE_PADO_SENT) 1789 return EIO; 1790 1791 /* Include AC cookie. */ 1792 len = sizeof(struct pppoetag) + sizeof(sc->sc_id); 1793 /* Include hunique. */ 1794 len += sizeof(struct pppoetag) + sc->sc_hunique_len; 1795 1796 m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN); 1797 if (!m0) 1798 return EIO; 1799 p = mtod(m0, uint8_t *); 1800 1801 PPPOE_ADD_HEADER(p, PPPOE_CODE_PADO, 0, len); 1802 PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE); 1803 PPPOE_ADD_16(p, sizeof(sc->sc_id)); 1804 memcpy(p, &sc->sc_id, sizeof(sc->sc_id)); 1805 p += sizeof(sc->sc_id); 1806 PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); 1807 PPPOE_ADD_16(p, sc->sc_hunique_len); 1808 memcpy(p, sc->sc_hunique, sc->sc_hunique_len); 1809 return pppoe_output(sc, m0); 1810} 1811 1812static int 1813pppoe_send_pads(struct pppoe_softc *sc) 1814{ 1815 struct bintime bt; 1816 struct mbuf *m0; 1817 uint8_t *p; 1818 size_t len, l1 = 0; /* XXX: gcc */ 1819 1820 KASSERT(PPPOE_WLOCKED(sc)); 1821 1822 if (sc->sc_state != PPPOE_STATE_PADO_SENT) 1823 return EIO; 1824 1825 getbinuptime(&bt); 1826 sc->sc_session = bt.sec % 0xff + 1; 1827 1828 /* Include service name. */ 1829 len = sizeof(struct pppoetag); 1830 if (sc->sc_service_name != NULL) { 1831 l1 = strlen(sc->sc_service_name); 1832 len += l1; 1833 } 1834 /* Include hunique. */ 1835 len += sizeof(struct pppoetag) + sc->sc_hunique_len; 1836 1837 m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN); 1838 if (!m0) 1839 return ENOBUFS; 1840 p = mtod(m0, uint8_t *); 1841 1842 PPPOE_ADD_HEADER(p, PPPOE_CODE_PADS, sc->sc_session, len); 1843 PPPOE_ADD_16(p, PPPOE_TAG_SNAME); 1844 if (sc->sc_service_name != NULL) { 1845 PPPOE_ADD_16(p, l1); 1846 memcpy(p, sc->sc_service_name, l1); 1847 p += l1; 1848 } else { 1849 PPPOE_ADD_16(p, 0); 1850 } 1851 PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); 1852 PPPOE_ADD_16(p, sc->sc_hunique_len); 1853 memcpy(p, sc->sc_hunique, sc->sc_hunique_len); 1854 return pppoe_output(sc, m0); 1855} 1856#endif 1857 1858static void 1859pppoe_tls(struct sppp *sp) 1860{ 1861 struct pppoe_softc *sc = (void *)sp; 1862 int wtime; 1863 1864 PPPOE_LOCK(sc, RW_READER); 1865 1866 if (sc->sc_state != PPPOE_STATE_INITIAL) { 1867 PPPOE_UNLOCK(sc); 1868 return; 1869 } 1870 1871 if (sc->sc_sppp.pp_phase == SPPP_PHASE_ESTABLISH && 1872 sc->sc_sppp.pp_auth_failures > 0) { 1873 /* 1874 * Delay trying to reconnect a bit more - the peer 1875 * might have failed to contact its radius server. 1876 */ 1877 wtime = PPPOE_RECON_FAST * sc->sc_sppp.pp_auth_failures; 1878 if (wtime > PPPOE_SLOW_RETRY) 1879 wtime = PPPOE_SLOW_RETRY; 1880 } else { 1881 wtime = PPPOE_RECON_IMMEDIATE; 1882 } 1883 callout_schedule(&sc->sc_timeout, wtime); 1884 1885 PPPOE_UNLOCK(sc); 1886} 1887 1888static void 1889pppoe_tlf(struct sppp *sp) 1890{ 1891 struct pppoe_softc *sc = (void *)sp; 1892 1893 PPPOE_LOCK(sc, RW_WRITER); 1894 1895 if (sc->sc_state < PPPOE_STATE_SESSION) { 1896 callout_stop(&sc->sc_timeout); 1897 sc->sc_state = PPPOE_STATE_INITIAL; 1898 sc->sc_padi_retried = 0; 1899 sc->sc_padr_retried = 0; 1900 memcpy(&sc->sc_dest, etherbroadcastaddr, 1901 sizeof(sc->sc_dest)); 1902 PPPOE_UNLOCK(sc); 1903 return; 1904 } 1905 1906 /* 1907 * Do not call pppoe_disconnect here, the upper layer state 1908 * machine gets confused by this. We must return from this 1909 * function and defer disconnecting to the timeout handler. 1910 */ 1911 sc->sc_state = PPPOE_STATE_CLOSING; 1912 1913 callout_schedule(&sc->sc_timeout, hz/50); 1914 1915 PPPOE_UNLOCK(sc); 1916} 1917 1918static void 1919pppoe_start(struct ifnet *ifp) 1920{ 1921 struct pppoe_softc *sc = (void *)ifp; 1922 struct mbuf *m; 1923 uint8_t *p; 1924 size_t len; 1925 1926 if (sppp_isempty(ifp)) 1927 return; 1928 1929 /* are we ready to process data yet? */ 1930 PPPOE_LOCK(sc, RW_READER); 1931 if (sc->sc_state < PPPOE_STATE_SESSION) { 1932 sppp_flush(&sc->sc_sppp.pp_if); 1933 PPPOE_UNLOCK(sc); 1934 return; 1935 } 1936 1937 while ((m = sppp_dequeue(ifp)) != NULL) { 1938 len = m->m_pkthdr.len; 1939 M_PREPEND(m, PPPOE_HEADERLEN, M_DONTWAIT); 1940 if (m == NULL) { 1941 if_statinc(ifp, if_oerrors); 1942 continue; 1943 } 1944 p = mtod(m, uint8_t *); 1945 PPPOE_ADD_HEADER(p, 0, sc->sc_session, len); 1946 1947 bpf_mtap(&sc->sc_sppp.pp_if, m, BPF_D_OUT); 1948 1949 pppoe_output(sc, m); 1950 } 1951 PPPOE_UNLOCK(sc); 1952} 1953 1954#ifdef PPPOE_MPSAFE 1955static int 1956pppoe_transmit(struct ifnet *ifp, struct mbuf *m) 1957{ 1958 struct pppoe_softc *sc = (void *)ifp; 1959 uint8_t *p; 1960 size_t len; 1961 1962 if (m == NULL) 1963 return EINVAL; 1964 1965 /* are we ready to process data yet? */ 1966 PPPOE_LOCK(sc, RW_READER); 1967 if (sc->sc_state < PPPOE_STATE_SESSION) { 1968 PPPOE_UNLOCK(sc); 1969 m_freem(m); 1970 return ENOBUFS; 1971 } 1972 1973 len = m->m_pkthdr.len; 1974 M_PREPEND(m, PPPOE_HEADERLEN, M_DONTWAIT); 1975 if (m == NULL) { 1976 PPPOE_UNLOCK(sc); 1977 if_statinc(ifp, if_oerrors); 1978 return ENETDOWN; 1979 } 1980 p = mtod(m, uint8_t *); 1981 PPPOE_ADD_HEADER(p, 0, sc->sc_session, len); 1982 1983 bpf_mtap(&sc->sc_sppp.pp_if, m, BPF_D_OUT); 1984 1985 pppoe_output(sc, m); 1986 PPPOE_UNLOCK(sc); 1987 return 0; 1988} 1989#endif /* PPPOE_MPSAFE */ 1990 1991static void 1992pppoe_ifattach_hook(void *arg, unsigned long cmd, void *arg2) 1993{ 1994 struct ifnet *ifp = arg2; 1995 struct pppoe_softc *sc; 1996 DECLARE_SPLNET_VARIABLE; 1997 1998 if (cmd != PFIL_IFNET_DETACH) 1999 return; 2000 2001 ACQUIRE_SPLNET(); 2002 rw_enter(&pppoe_softc_list_lock, RW_READER); 2003 LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { 2004 PPPOE_LOCK(sc, RW_WRITER); 2005 if (sc->sc_eth_if != ifp) { 2006 PPPOE_UNLOCK(sc); 2007 continue; 2008 } 2009 if (sc->sc_sppp.pp_if.if_flags & IFF_UP) { 2010 sc->sc_sppp.pp_if.if_flags &= ~(IFF_UP|IFF_RUNNING); 2011 pppoe_printf(sc, 2012 "ethernet interface detached, going down\n"); 2013 } 2014 sc->sc_eth_if = NULL; 2015 pppoe_clear_softc(sc, "ethernet interface detached"); 2016 PPPOE_UNLOCK(sc); 2017 } 2018 rw_exit(&pppoe_softc_list_lock); 2019 RELEASE_SPLNET(); 2020} 2021 2022static void 2023pppoe_clear_softc(struct pppoe_softc *sc, const char *message) 2024{ 2025 KASSERT(PPPOE_WLOCKED(sc)); 2026 2027 /* stop timer */ 2028 callout_stop(&sc->sc_timeout); 2029 pppoe_printf(sc, "session 0x%x terminated, %s\n", 2030 sc->sc_session, message); 2031 2032 /* fix our state */ 2033 sc->sc_state = PPPOE_STATE_INITIAL; 2034 2035 PPPOE_UNLOCK(sc); 2036 2037 /* signal upper layer */ 2038 sc->sc_sppp.pp_down(&sc->sc_sppp); 2039 2040 PPPOE_LOCK(sc, RW_WRITER); 2041 2042 /* clean up softc */ 2043 memcpy(&sc->sc_dest, etherbroadcastaddr, sizeof(sc->sc_dest)); 2044 if (sc->sc_ac_cookie) { 2045 free(sc->sc_ac_cookie, M_DEVBUF); 2046 sc->sc_ac_cookie = NULL; 2047 } 2048 if (sc->sc_relay_sid) { 2049 free(sc->sc_relay_sid, M_DEVBUF); 2050 sc->sc_relay_sid = NULL; 2051 } 2052 sc->sc_ac_cookie_len = 0; 2053 sc->sc_session = 0; 2054} 2055 2056static void 2057pppoe_enqueue(struct ifqueue *inq, struct mbuf *m) 2058{ 2059 if (m->m_flags & M_PROMISC) { 2060 m_freem(m); 2061 return; 2062 } 2063 2064#ifndef PPPOE_SERVER 2065 if (m->m_flags & (M_MCAST | M_BCAST)) { 2066 m_freem(m); 2067 return; 2068 } 2069#endif 2070 2071 IFQ_LOCK(inq); 2072 if (IF_QFULL(inq)) { 2073 IF_DROP(inq); 2074 IFQ_UNLOCK(inq); 2075 m_freem(m); 2076 } else { 2077 IF_ENQUEUE(inq, m); 2078 IFQ_UNLOCK(inq); 2079 softint_schedule(pppoe_softintr); 2080 } 2081 return; 2082} 2083 2084void 2085pppoe_input(struct ifnet *ifp, struct mbuf *m) 2086{ 2087 pppoe_enqueue(&ppoeinq, m); 2088 return; 2089} 2090 2091void 2092pppoedisc_input(struct ifnet *ifp, struct mbuf *m) 2093{ 2094 pppoe_enqueue(&ppoediscinq, m); 2095 return; 2096} 2097 2098static void 2099sysctl_net_pppoe_setup(struct sysctllog **clog) 2100{ 2101 const struct sysctlnode *node = NULL; 2102 2103 sysctl_createv(clog, 0, NULL, &node, 2104 CTLFLAG_PERMANENT, 2105 CTLTYPE_NODE, "pppoe", 2106 SYSCTL_DESCR("PPPOE protocol"), 2107 NULL, 0, NULL, 0, 2108 CTL_NET, CTL_CREATE, CTL_EOL); 2109 2110 if (node == NULL) 2111 return; 2112 2113 sysctl_createv(clog, 0, &node, NULL, 2114 CTLFLAG_PERMANENT | CTLFLAG_READWRITE, 2115 CTLTYPE_BOOL, "term_unknown", 2116 SYSCTL_DESCR("Terminate unknown sessions"), 2117 NULL, 0, &pppoe_term_unknown, sizeof(pppoe_term_unknown), 2118 CTL_CREATE, CTL_EOL); 2119} 2120 2121/* 2122 * Module infrastructure 2123 */ 2124#include "if_module.h" 2125 2126IF_MODULE(MODULE_CLASS_DRIVER, pppoe, "sppp_subr") 2127