Lines Matching +full:stop +full:- +full:ack

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Point-to-point protocol support
6 * Copyright (C) 1999 - 2008 Krzysztof Halasa <khc@pm.waw.pl>
68 u8 cr_id; /* ID of last Configuration-Request */
79 u8 echo_id; /* ID of last Echo-Request (LCP) */
84 enum {START = 0, STOP, TO_GOOD, TO_BAD, RCR_GOOD, RCR_BAD, RCA, RCN, RTR, RTA, enumerator
96 "Start", "Stop", "TO+", "TO-", "RCR+", "RCR-", "RCA", "RCN",
97 "RTR", "RTA", "RUC", "RXJ+", "RXJ-"
107 return (struct ppp *)dev_to_hdlc(dev)->state; in get_ppp()
116 return &ppp->protos[IDX_LCP]; in get_proto()
118 return &ppp->protos[IDX_IPCP]; in get_proto()
120 return &ppp->protos[IDX_IPV6CP]; in get_proto()
142 struct hdlc_header *data = (struct hdlc_header *)skb->data; in ppp_type_trans()
144 if (skb->len < sizeof(struct hdlc_header)) in ppp_type_trans()
146 if (data->address != HDLC_ADDR_ALLSTATIONS || in ppp_type_trans()
147 data->control != HDLC_CTRL_UI) in ppp_type_trans()
150 switch (data->protocol) { in ppp_type_trans()
170 printk(KERN_DEBUG "%s: ppp_hard_header() called\n", dev->name); in ppp_hard_header()
174 data = (struct hdlc_header *)skb->data; in ppp_hard_header()
176 data->address = HDLC_ADDR_ALLSTATIONS; in ppp_hard_header()
177 data->control = HDLC_CTRL_UI; in ppp_hard_header()
180 data->protocol = htons(PID_IP); in ppp_hard_header()
183 data->protocol = htons(PID_IPV6); in ppp_hard_header()
188 data->protocol = htons(type); in ppp_hard_header()
191 data->protocol = 0; in ppp_hard_header()
228 cp->code = code; in ppp_tx_cp()
229 cp->id = id; in ppp_tx_cp()
230 cp->len = htons(sizeof(struct cp_header) + magic_len + len); in ppp_tx_cp()
242 sprintf(ptr, " %02X", skb->data[sizeof(struct cp_header) + i]); in ppp_tx_cp()
245 printk(KERN_DEBUG "%s: TX %s [%s id 0x%X]%s\n", dev->name, in ppp_tx_cp()
251 skb->priority = TC_PRIO_CONTROL; in ppp_tx_cp()
252 skb->dev = dev; in ppp_tx_cp()
253 skb->protocol = htons(ETH_P_HDLC); in ppp_tx_cp()
258 /* State transition table (compare STD-51)
260 TO+ = Timeout with counter > 0 irc = Initialize-Restart-Count
261 TO- = Timeout with counter expired zrc = Zero-Restart-Count
263 RCR+ = Receive-Configure-Request (Good) scr = Send-Configure-Request
264 RCR- = Receive-Configure-Request (Bad)
265 RCA = Receive-Configure-Ack sca = Send-Configure-Ack
266 RCN = Receive-Configure-Nak/Rej scn = Send-Configure-Nak/Rej
268 RTR = Receive-Terminate-Request str = Send-Terminate-Request
269 RTA = Receive-Terminate-Ack sta = Send-Terminate-Ack
271 RUC = Receive-Unknown-Code scj = Send-Code-Reject
272 RXJ+ = Receive-Code-Reject (permitted)
273 or Receive-Protocol-Reject
274 RXJ- = Receive-Code-Reject (catastrophic)
275 or Receive-Protocol-Reject
281 { INV , 0 , 0 , 0 , 0 , 0 , 0 }, /* STOP */
283 { INV , INV , 1 , 1 , 1 , 1 , INV }, /* TO- */
285 { STA|0 ,IRC|SCR|SCN|3, 2 , SCN|3 ,SCN|4, SCN|3 ,SCR|SCN|3}, /* RCR- */
292 { 0 , 1 , 1 , 1 , 1 , 1 ,IRC|STR|2}, /* RXJ- */
296 SCN: RCR- must supply code, id, len and data
306 old_state = proto->state; in ppp_cp_event()
311 printk(KERN_DEBUG "%s: %s ppp_cp_event(%s) %s ...\n", dev->name, in ppp_cp_event()
312 proto_name(pid), event_names[event], state_names[proto->state]); in ppp_cp_event()
317 proto->state = action & STATE_MASK; in ppp_cp_event()
318 if (action & (SCR | STR)) /* set Configure-Req/Terminate-Req timer */ in ppp_cp_event()
319 mod_timer(&proto->timer, proto->timeout = in ppp_cp_event()
320 jiffies + ppp->req_timeout * HZ); in ppp_cp_event()
322 proto->restart_counter = 0; in ppp_cp_event()
324 proto->restart_counter = (proto->state == STOPPING) ? in ppp_cp_event()
325 ppp->term_retries : ppp->cr_retries; in ppp_cp_event()
327 if (action & SCR) /* send Configure-Request */ in ppp_cp_event()
328 ppp_tx_cp(dev, pid, CP_CONF_REQ, proto->cr_id = ++ppp->seq, in ppp_cp_event()
330 if (action & SCA) /* send Configure-Ack */ in ppp_cp_event()
332 if (action & SCN) /* send Configure-Nak/Reject */ in ppp_cp_event()
334 if (action & STR) /* send Terminate-Request */ in ppp_cp_event()
335 ppp_tx_cp(dev, pid, CP_TERM_REQ, ++ppp->seq, 0, NULL); in ppp_cp_event()
336 if (action & STA) /* send Terminate-Ack */ in ppp_cp_event()
338 if (action & SCJ) /* send Code-Reject */ in ppp_cp_event()
339 ppp_tx_cp(dev, pid, CP_CODE_REJ, ++ppp->seq, len, data); in ppp_cp_event()
341 if (old_state != OPENED && proto->state == OPENED) { in ppp_cp_event()
347 ppp->last_pong = jiffies; in ppp_cp_event()
348 mod_timer(&proto->timer, proto->timeout = in ppp_cp_event()
349 jiffies + ppp->keepalive_interval * HZ); in ppp_cp_event()
352 if (old_state == OPENED && proto->state != OPENED) { in ppp_cp_event()
356 ppp_cp_event(dev, PID_IPCP, STOP, 0, 0, 0, NULL); in ppp_cp_event()
357 ppp_cp_event(dev, PID_IPV6CP, STOP, 0, 0, 0, NULL); in ppp_cp_event()
360 if (old_state != CLOSED && proto->state == CLOSED) in ppp_cp_event()
361 timer_delete(&proto->timer); in ppp_cp_event()
364 printk(KERN_DEBUG "%s: %s ppp_cp_event(%s) ... %s\n", dev->name, in ppp_cp_event()
365 proto_name(pid), event_names[event], state_names[proto->state]); in ppp_cp_event()
379 dev->stats.rx_dropped++; in ppp_cp_parse_cr()
383 for (opt = data; len; len -= opt[1], opt += opt[1]) { in ppp_cp_parse_cr()
429 dev->stats.rx_errors++; in ppp_cp_parse_cr()
435 struct hdlc_header *hdr = (struct hdlc_header *)skb->data; in ppp_rx()
436 struct net_device *dev = skb->dev; in ppp_rx()
448 spin_lock_irqsave(&ppp->lock, flags); in ppp_rx()
450 if (skb->len < sizeof(struct hdlc_header)) in ppp_rx()
453 if (hdr->address != HDLC_ADDR_ALLSTATIONS || in ppp_rx()
454 hdr->control != HDLC_CTRL_UI) in ppp_rx()
457 pid = ntohs(hdr->protocol); in ppp_rx()
460 if (ppp->protos[IDX_LCP].state == OPENED) in ppp_rx()
462 ++ppp->seq, skb->len + 2, &hdr->protocol); in ppp_rx()
466 len = ntohs(cp->len); in ppp_rx()
468 skb->len < len /* truncated packet? */) in ppp_rx()
471 len -= sizeof(struct cp_header); in ppp_rx()
475 if (cp->code < CP_CODES) in ppp_rx()
476 sprintf(debug_buffer, "[%s id 0x%X]", code_names[cp->code], in ppp_rx()
477 cp->id); in ppp_rx()
479 sprintf(debug_buffer, "[code %u id 0x%X]", cp->code, cp->id); in ppp_rx()
482 sprintf(ptr, " %02X", skb->data[i]); in ppp_rx()
485 printk(KERN_DEBUG "%s: RX %s %s\n", dev->name, proto_name(pid), in ppp_rx()
491 switch (cp->code) { in ppp_rx()
493 pid = ntohs(*(__be16 *)skb->data); in ppp_rx()
500 case LCP_ECHO_REQ: /* send Echo-Reply */ in ppp_rx()
501 if (len >= 4 && proto->state == OPENED) in ppp_rx()
503 cp->id, len - 4, skb->data + 4); in ppp_rx()
507 if (cp->id == ppp->echo_id) in ppp_rx()
508 ppp->last_pong = jiffies; in ppp_rx()
516 switch (cp->code) { in ppp_rx()
518 ppp_cp_parse_cr(dev, pid, cp->id, len, skb->data); in ppp_rx()
522 if (cp->id == proto->cr_id) in ppp_rx()
528 if (cp->id == proto->cr_id) in ppp_rx()
533 ppp_cp_event(dev, pid, RTR, 0, cp->id, 0, NULL); in ppp_rx()
546 if (len > dev->mtu) in ppp_rx()
547 len = dev->mtu; in ppp_rx()
554 dev->stats.rx_errors++; in ppp_rx()
556 spin_unlock_irqrestore(&ppp->lock, flags); in ppp_rx()
565 struct ppp *ppp = get_ppp(proto->dev); in ppp_timer()
568 spin_lock_irqsave(&ppp->lock, flags); in ppp_timer()
572 if (timer_pending(&proto->timer)) { in ppp_timer()
573 spin_unlock_irqrestore(&ppp->lock, flags); in ppp_timer()
576 switch (proto->state) { in ppp_timer()
581 if (proto->restart_counter) { in ppp_timer()
582 ppp_cp_event(proto->dev, proto->pid, TO_GOOD, 0, 0, in ppp_timer()
584 proto->restart_counter--; in ppp_timer()
585 } else if (netif_carrier_ok(proto->dev)) in ppp_timer()
586 ppp_cp_event(proto->dev, proto->pid, TO_GOOD, 0, 0, in ppp_timer()
589 ppp_cp_event(proto->dev, proto->pid, TO_BAD, 0, 0, in ppp_timer()
594 if (proto->pid != PID_LCP) in ppp_timer()
596 if (time_after(jiffies, ppp->last_pong + in ppp_timer()
597 ppp->keepalive_timeout * HZ)) { in ppp_timer()
598 netdev_info(proto->dev, "Link down\n"); in ppp_timer()
599 ppp_cp_event(proto->dev, PID_LCP, STOP, 0, 0, 0, NULL); in ppp_timer()
600 ppp_cp_event(proto->dev, PID_LCP, START, 0, 0, 0, NULL); in ppp_timer()
601 } else { /* send keep-alive packet */ in ppp_timer()
602 ppp->echo_id = ++ppp->seq; in ppp_timer()
603 ppp_tx_cp(proto->dev, PID_LCP, LCP_ECHO_REQ, in ppp_timer()
604 ppp->echo_id, 0, NULL); in ppp_timer()
605 proto->timer.expires = jiffies + in ppp_timer()
606 ppp->keepalive_interval * HZ; in ppp_timer()
607 add_timer(&proto->timer); in ppp_timer()
611 spin_unlock_irqrestore(&ppp->lock, flags); in ppp_timer()
621 struct proto *proto = &ppp->protos[i]; in ppp_start()
623 proto->dev = dev; in ppp_start()
624 timer_setup(&proto->timer, ppp_timer, 0); in ppp_start()
625 proto->state = CLOSED; in ppp_start()
627 ppp->protos[IDX_LCP].pid = PID_LCP; in ppp_start()
628 ppp->protos[IDX_IPCP].pid = PID_IPCP; in ppp_start()
629 ppp->protos[IDX_IPV6CP].pid = PID_IPV6CP; in ppp_start()
636 ppp_cp_event(dev, PID_LCP, STOP, 0, 0, 0, NULL); in ppp_stop()
646 .stop = ppp_stop,
664 switch (ifs->type) { in ppp_ioctl()
666 if (dev_to_hdlc(dev)->proto != &proto) in ppp_ioctl()
667 return -EINVAL; in ppp_ioctl()
668 ifs->type = IF_PROTO_PPP; in ppp_ioctl()
673 return -EPERM; in ppp_ioctl()
675 if (dev->flags & IFF_UP) in ppp_ioctl()
676 return -EBUSY; in ppp_ioctl()
680 result = hdlc->attach(dev, ENCODING_NRZ, in ppp_ioctl()
690 spin_lock_init(&ppp->lock); in ppp_ioctl()
691 ppp->req_timeout = 2; in ppp_ioctl()
692 ppp->cr_retries = 10; in ppp_ioctl()
693 ppp->term_retries = 2; in ppp_ioctl()
694 ppp->keepalive_interval = 10; in ppp_ioctl()
695 ppp->keepalive_timeout = 60; in ppp_ioctl()
697 dev->hard_header_len = sizeof(struct hdlc_header); in ppp_ioctl()
698 dev->header_ops = &ppp_header_ops; in ppp_ioctl()
699 dev->type = ARPHRD_PPP; in ppp_ioctl()
705 return -EINVAL; in ppp_ioctl()