1 // SPDX-License-Identifier: GPL-2.0-only
3 * Generic HDLC support routines for Linux
4 * Point-to-point protocol support
6 * Copyright (C) 1999 - 2008 Krzysztof Halasa <khc@pm.waw.pl>
9 #include <linux/errno.h>
10 #include <linux/hdlc.h>
11 #include <linux/if_arp.h>
12 #include <linux/inetdevice.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/pkt_sched.h>
17 #include <linux/poll.h>
18 #include <linux/skbuff.h>
19 #include <linux/slab.h>
20 #include <linux/spinlock.h>
22 #define DEBUG_CP 0 /* also bytes# to dump */
24 #define DEBUG_HARD_HEADER 0
26 #define HDLC_ADDR_ALLSTATIONS 0xFF
27 #define HDLC_CTRL_UI 0x03
29 #define PID_LCP 0xC021
31 #define PID_IPCP 0x8021
32 #define PID_IPV6 0x0057
33 #define PID_IPV6CP 0x8057
35 enum {IDX_LCP
= 0, IDX_IPCP
, IDX_IPV6CP
, IDX_COUNT
};
36 enum {CP_CONF_REQ
= 1, CP_CONF_ACK
, CP_CONF_NAK
, CP_CONF_REJ
, CP_TERM_REQ
,
37 CP_TERM_ACK
, CP_CODE_REJ
, LCP_PROTO_REJ
, LCP_ECHO_REQ
, LCP_ECHO_REPLY
,
38 LCP_DISC_REQ
, CP_CODES
};
40 static const char *const code_names
[CP_CODES
] = {
41 "0", "ConfReq", "ConfAck", "ConfNak", "ConfRej", "TermReq",
42 "TermAck", "CodeRej", "ProtoRej", "EchoReq", "EchoReply", "Discard"
44 static char debug_buffer
[64 + 3 * DEBUG_CP
];
47 enum {LCP_OPTION_MRU
= 1, LCP_OPTION_ACCM
, LCP_OPTION_MAGIC
= 5};
63 struct net_device
*dev
;
64 struct timer_list timer
;
65 unsigned long timeout
;
66 u16 pid
; /* protocol ID */
68 u8 cr_id
; /* ID of last Configuration-Request */
73 struct proto protos
[IDX_COUNT
];
75 unsigned long last_pong
;
76 unsigned int req_timeout
, cr_retries
, term_retries
;
77 unsigned int keepalive_interval
, keepalive_timeout
;
78 u8 seq
; /* local sequence number for requests */
79 u8 echo_id
; /* ID of last Echo-Request (LCP) */
82 enum {CLOSED
= 0, STOPPED
, STOPPING
, REQ_SENT
, ACK_RECV
, ACK_SENT
, OPENED
,
83 STATES
, STATE_MASK
= 0xF};
84 enum {START
= 0, STOP
, TO_GOOD
, TO_BAD
, RCR_GOOD
, RCR_BAD
, RCA
, RCN
, RTR
, RTA
,
85 RUC
, RXJ_GOOD
, RXJ_BAD
, EVENTS
};
86 enum {INV
= 0x10, IRC
= 0x20, ZRC
= 0x40, SCR
= 0x80, SCA
= 0x100,
87 SCN
= 0x200, STR
= 0x400, STA
= 0x800, SCJ
= 0x1000};
90 static const char *const state_names
[STATES
] = {
91 "Closed", "Stopped", "Stopping", "ReqSent", "AckRecv", "AckSent",
94 static const char *const event_names
[EVENTS
] = {
95 "Start", "Stop", "TO+", "TO-", "RCR+", "RCR-", "RCA", "RCN",
96 "RTR", "RTA", "RUC", "RXJ+", "RXJ-"
100 static struct sk_buff_head tx_queue
; /* used when holding the spin lock */
102 static int ppp_ioctl(struct net_device
*dev
, struct ifreq
*ifr
);
104 static inline struct ppp
* get_ppp(struct net_device
*dev
)
106 return (struct ppp
*)dev_to_hdlc(dev
)->state
;
109 static inline struct proto
* get_proto(struct net_device
*dev
, u16 pid
)
111 struct ppp
*ppp
= get_ppp(dev
);
115 return &ppp
->protos
[IDX_LCP
];
117 return &ppp
->protos
[IDX_IPCP
];
119 return &ppp
->protos
[IDX_IPV6CP
];
125 static inline const char* proto_name(u16 pid
)
139 static __be16
ppp_type_trans(struct sk_buff
*skb
, struct net_device
*dev
)
141 struct hdlc_header
*data
= (struct hdlc_header
*)skb
->data
;
143 if (skb
->len
< sizeof(struct hdlc_header
))
144 return htons(ETH_P_HDLC
);
145 if (data
->address
!= HDLC_ADDR_ALLSTATIONS
||
146 data
->control
!= HDLC_CTRL_UI
)
147 return htons(ETH_P_HDLC
);
149 switch (data
->protocol
) {
150 case cpu_to_be16(PID_IP
):
151 skb_pull(skb
, sizeof(struct hdlc_header
));
152 return htons(ETH_P_IP
);
154 case cpu_to_be16(PID_IPV6
):
155 skb_pull(skb
, sizeof(struct hdlc_header
));
156 return htons(ETH_P_IPV6
);
159 return htons(ETH_P_HDLC
);
164 static int ppp_hard_header(struct sk_buff
*skb
, struct net_device
*dev
,
165 u16 type
, const void *daddr
, const void *saddr
,
168 struct hdlc_header
*data
;
169 #if DEBUG_HARD_HEADER
170 printk(KERN_DEBUG
"%s: ppp_hard_header() called\n", dev
->name
);
173 skb_push(skb
, sizeof(struct hdlc_header
));
174 data
= (struct hdlc_header
*)skb
->data
;
176 data
->address
= HDLC_ADDR_ALLSTATIONS
;
177 data
->control
= HDLC_CTRL_UI
;
180 data
->protocol
= htons(PID_IP
);
183 data
->protocol
= htons(PID_IPV6
);
188 data
->protocol
= htons(type
);
190 default: /* unknown protocol */
193 return sizeof(struct hdlc_header
);
197 static void ppp_tx_flush(void)
200 while ((skb
= skb_dequeue(&tx_queue
)) != NULL
)
204 static void ppp_tx_cp(struct net_device
*dev
, u16 pid
, u8 code
,
205 u8 id
, unsigned int len
, const void *data
)
208 struct cp_header
*cp
;
209 unsigned int magic_len
= 0;
217 if (pid
== PID_LCP
&& (code
== LCP_ECHO_REQ
|| code
== LCP_ECHO_REPLY
))
218 magic_len
= sizeof(magic
);
220 skb
= dev_alloc_skb(sizeof(struct hdlc_header
) +
221 sizeof(struct cp_header
) + magic_len
+ len
);
223 netdev_warn(dev
, "out of memory in ppp_tx_cp()\n");
226 skb_reserve(skb
, sizeof(struct hdlc_header
));
228 cp
= skb_put(skb
, sizeof(struct cp_header
));
231 cp
->len
= htons(sizeof(struct cp_header
) + magic_len
+ len
);
234 skb_put_data(skb
, &magic
, magic_len
);
236 skb_put_data(skb
, data
, len
);
239 BUG_ON(code
>= CP_CODES
);
242 for (i
= 0; i
< min_t(unsigned int, magic_len
+ len
, DEBUG_CP
); i
++) {
243 sprintf(ptr
, " %02X", skb
->data
[sizeof(struct cp_header
) + i
]);
246 printk(KERN_DEBUG
"%s: TX %s [%s id 0x%X]%s\n", dev
->name
,
247 proto_name(pid
), code_names
[code
], id
, debug_buffer
);
250 ppp_hard_header(skb
, dev
, pid
, NULL
, NULL
, 0);
252 skb
->priority
= TC_PRIO_CONTROL
;
254 skb
->protocol
= htons(ETH_P_HDLC
);
255 skb_reset_network_header(skb
);
256 skb_queue_tail(&tx_queue
, skb
);
260 /* State transition table (compare STD-51)
262 TO+ = Timeout with counter > 0 irc = Initialize-Restart-Count
263 TO- = Timeout with counter expired zrc = Zero-Restart-Count
265 RCR+ = Receive-Configure-Request (Good) scr = Send-Configure-Request
266 RCR- = Receive-Configure-Request (Bad)
267 RCA = Receive-Configure-Ack sca = Send-Configure-Ack
268 RCN = Receive-Configure-Nak/Rej scn = Send-Configure-Nak/Rej
270 RTR = Receive-Terminate-Request str = Send-Terminate-Request
271 RTA = Receive-Terminate-Ack sta = Send-Terminate-Ack
273 RUC = Receive-Unknown-Code scj = Send-Code-Reject
274 RXJ+ = Receive-Code-Reject (permitted)
275 or Receive-Protocol-Reject
276 RXJ- = Receive-Code-Reject (catastrophic)
277 or Receive-Protocol-Reject
279 static int cp_table
[EVENTS
][STATES
] = {
280 /* CLOSED STOPPED STOPPING REQ_SENT ACK_RECV ACK_SENT OPENED
282 {IRC
|SCR
|3, INV
, INV
, INV
, INV
, INV
, INV
}, /* START */
283 { INV
, 0 , 0 , 0 , 0 , 0 , 0 }, /* STOP */
284 { INV
, INV
,STR
|2, SCR
|3 ,SCR
|3, SCR
|5 , INV
}, /* TO+ */
285 { INV
, INV
, 1 , 1 , 1 , 1 , INV
}, /* TO- */
286 { STA
|0 ,IRC
|SCR
|SCA
|5, 2 , SCA
|5 ,SCA
|6, SCA
|5 ,SCR
|SCA
|5}, /* RCR+ */
287 { STA
|0 ,IRC
|SCR
|SCN
|3, 2 , SCN
|3 ,SCN
|4, SCN
|3 ,SCR
|SCN
|3}, /* RCR- */
288 { STA
|0 , STA
|1 , 2 , IRC
|4 ,SCR
|3, 6 , SCR
|3 }, /* RCA */
289 { STA
|0 , STA
|1 , 2 ,IRC
|SCR
|3,SCR
|3,IRC
|SCR
|5, SCR
|3 }, /* RCN */
290 { STA
|0 , STA
|1 ,STA
|2, STA
|3 ,STA
|3, STA
|3 ,ZRC
|STA
|2}, /* RTR */
291 { 0 , 1 , 1 , 3 , 3 , 5 , SCR
|3 }, /* RTA */
292 { SCJ
|0 , SCJ
|1 ,SCJ
|2, SCJ
|3 ,SCJ
|4, SCJ
|5 , SCJ
|6 }, /* RUC */
293 { 0 , 1 , 2 , 3 , 3 , 5 , 6 }, /* RXJ+ */
294 { 0 , 1 , 1 , 1 , 1 , 1 ,IRC
|STR
|2}, /* RXJ- */
298 /* SCA: RCR+ must supply id, len and data
299 SCN: RCR- must supply code, id, len and data
300 STA: RTR must supply id
301 SCJ: RUC must supply CP packet len and data */
302 static void ppp_cp_event(struct net_device
*dev
, u16 pid
, u16 event
, u8 code
,
303 u8 id
, unsigned int len
, const void *data
)
305 int old_state
, action
;
306 struct ppp
*ppp
= get_ppp(dev
);
307 struct proto
*proto
= get_proto(dev
, pid
);
309 old_state
= proto
->state
;
310 BUG_ON(old_state
>= STATES
);
311 BUG_ON(event
>= EVENTS
);
314 printk(KERN_DEBUG
"%s: %s ppp_cp_event(%s) %s ...\n", dev
->name
,
315 proto_name(pid
), event_names
[event
], state_names
[proto
->state
]);
318 action
= cp_table
[event
][old_state
];
320 proto
->state
= action
& STATE_MASK
;
321 if (action
& (SCR
| STR
)) /* set Configure-Req/Terminate-Req timer */
322 mod_timer(&proto
->timer
, proto
->timeout
=
323 jiffies
+ ppp
->req_timeout
* HZ
);
325 proto
->restart_counter
= 0;
327 proto
->restart_counter
= (proto
->state
== STOPPING
) ?
328 ppp
->term_retries
: ppp
->cr_retries
;
330 if (action
& SCR
) /* send Configure-Request */
331 ppp_tx_cp(dev
, pid
, CP_CONF_REQ
, proto
->cr_id
= ++ppp
->seq
,
333 if (action
& SCA
) /* send Configure-Ack */
334 ppp_tx_cp(dev
, pid
, CP_CONF_ACK
, id
, len
, data
);
335 if (action
& SCN
) /* send Configure-Nak/Reject */
336 ppp_tx_cp(dev
, pid
, code
, id
, len
, data
);
337 if (action
& STR
) /* send Terminate-Request */
338 ppp_tx_cp(dev
, pid
, CP_TERM_REQ
, ++ppp
->seq
, 0, NULL
);
339 if (action
& STA
) /* send Terminate-Ack */
340 ppp_tx_cp(dev
, pid
, CP_TERM_ACK
, id
, 0, NULL
);
341 if (action
& SCJ
) /* send Code-Reject */
342 ppp_tx_cp(dev
, pid
, CP_CODE_REJ
, ++ppp
->seq
, len
, data
);
344 if (old_state
!= OPENED
&& proto
->state
== OPENED
) {
345 netdev_info(dev
, "%s up\n", proto_name(pid
));
346 if (pid
== PID_LCP
) {
347 netif_dormant_off(dev
);
348 ppp_cp_event(dev
, PID_IPCP
, START
, 0, 0, 0, NULL
);
349 ppp_cp_event(dev
, PID_IPV6CP
, START
, 0, 0, 0, NULL
);
350 ppp
->last_pong
= jiffies
;
351 mod_timer(&proto
->timer
, proto
->timeout
=
352 jiffies
+ ppp
->keepalive_interval
* HZ
);
355 if (old_state
== OPENED
&& proto
->state
!= OPENED
) {
356 netdev_info(dev
, "%s down\n", proto_name(pid
));
357 if (pid
== PID_LCP
) {
358 netif_dormant_on(dev
);
359 ppp_cp_event(dev
, PID_IPCP
, STOP
, 0, 0, 0, NULL
);
360 ppp_cp_event(dev
, PID_IPV6CP
, STOP
, 0, 0, 0, NULL
);
363 if (old_state
!= CLOSED
&& proto
->state
== CLOSED
)
364 del_timer(&proto
->timer
);
367 printk(KERN_DEBUG
"%s: %s ppp_cp_event(%s) ... %s\n", dev
->name
,
368 proto_name(pid
), event_names
[event
], state_names
[proto
->state
]);
373 static void ppp_cp_parse_cr(struct net_device
*dev
, u16 pid
, u8 id
,
374 unsigned int req_len
, const u8
*data
)
376 static u8
const valid_accm
[6] = { LCP_OPTION_ACCM
, 6, 0, 0, 0, 0 };
379 unsigned int len
= req_len
, nak_len
= 0, rej_len
= 0;
381 if (!(out
= kmalloc(len
, GFP_ATOMIC
))) {
382 dev
->stats
.rx_dropped
++;
383 return; /* out of memory, ignore CR packet */
386 for (opt
= data
; len
; len
-= opt
[1], opt
+= opt
[1]) {
387 if (len
< 2 || opt
[1] < 2 || len
< opt
[1])
393 continue; /* MRU always OK and > 1500 bytes? */
395 case LCP_OPTION_ACCM
: /* async control character map */
396 if (opt
[1] < sizeof(valid_accm
))
398 if (!memcmp(opt
, valid_accm
,
401 if (!rej_len
) { /* NAK it */
402 memcpy(out
+ nak_len
, valid_accm
,
404 nak_len
+= sizeof(valid_accm
);
408 case LCP_OPTION_MAGIC
:
411 if (opt
[1] != 6 || (!opt
[2] && !opt
[3] &&
413 break; /* reject invalid magic number */
416 /* reject this option */
417 memcpy(out
+ rej_len
, opt
, opt
[1]);
422 ppp_cp_event(dev
, pid
, RCR_BAD
, CP_CONF_REJ
, id
, rej_len
, out
);
424 ppp_cp_event(dev
, pid
, RCR_BAD
, CP_CONF_NAK
, id
, nak_len
, out
);
426 ppp_cp_event(dev
, pid
, RCR_GOOD
, CP_CONF_ACK
, id
, req_len
, data
);
432 dev
->stats
.rx_errors
++;
436 static int ppp_rx(struct sk_buff
*skb
)
438 struct hdlc_header
*hdr
= (struct hdlc_header
*)skb
->data
;
439 struct net_device
*dev
= skb
->dev
;
440 struct ppp
*ppp
= get_ppp(dev
);
442 struct cp_header
*cp
;
451 spin_lock_irqsave(&ppp
->lock
, flags
);
452 /* Check HDLC header */
453 if (skb
->len
< sizeof(struct hdlc_header
))
455 cp
= skb_pull(skb
, sizeof(struct hdlc_header
));
456 if (hdr
->address
!= HDLC_ADDR_ALLSTATIONS
||
457 hdr
->control
!= HDLC_CTRL_UI
)
460 pid
= ntohs(hdr
->protocol
);
461 proto
= get_proto(dev
, pid
);
463 if (ppp
->protos
[IDX_LCP
].state
== OPENED
)
464 ppp_tx_cp(dev
, PID_LCP
, LCP_PROTO_REJ
,
465 ++ppp
->seq
, skb
->len
+ 2, &hdr
->protocol
);
469 len
= ntohs(cp
->len
);
470 if (len
< sizeof(struct cp_header
) /* no complete CP header? */ ||
471 skb
->len
< len
/* truncated packet? */)
473 skb_pull(skb
, sizeof(struct cp_header
));
474 len
-= sizeof(struct cp_header
);
476 /* HDLC and CP headers stripped from skb */
478 if (cp
->code
< CP_CODES
)
479 sprintf(debug_buffer
, "[%s id 0x%X]", code_names
[cp
->code
],
482 sprintf(debug_buffer
, "[code %u id 0x%X]", cp
->code
, cp
->id
);
483 ptr
= debug_buffer
+ strlen(debug_buffer
);
484 for (i
= 0; i
< min_t(unsigned int, len
, DEBUG_CP
); i
++) {
485 sprintf(ptr
, " %02X", skb
->data
[i
]);
488 printk(KERN_DEBUG
"%s: RX %s %s\n", dev
->name
, proto_name(pid
),
496 pid
= ntohs(*(__be16
*)skb
->data
);
497 if (pid
== PID_LCP
|| pid
== PID_IPCP
||
499 ppp_cp_event(dev
, pid
, RXJ_BAD
, 0, 0,
503 case LCP_ECHO_REQ
: /* send Echo-Reply */
504 if (len
>= 4 && proto
->state
== OPENED
)
505 ppp_tx_cp(dev
, PID_LCP
, LCP_ECHO_REPLY
,
506 cp
->id
, len
- 4, skb
->data
+ 4);
510 if (cp
->id
== ppp
->echo_id
)
511 ppp
->last_pong
= jiffies
;
514 case LCP_DISC_REQ
: /* discard */
518 /* LCP, IPCP and IPV6CP */
521 ppp_cp_parse_cr(dev
, pid
, cp
->id
, len
, skb
->data
);
525 if (cp
->id
== proto
->cr_id
)
526 ppp_cp_event(dev
, pid
, RCA
, 0, 0, 0, NULL
);
531 if (cp
->id
== proto
->cr_id
)
532 ppp_cp_event(dev
, pid
, RCN
, 0, 0, 0, NULL
);
536 ppp_cp_event(dev
, pid
, RTR
, 0, cp
->id
, 0, NULL
);
540 ppp_cp_event(dev
, pid
, RTA
, 0, 0, 0, NULL
);
544 ppp_cp_event(dev
, pid
, RXJ_BAD
, 0, 0, 0, NULL
);
548 len
+= sizeof(struct cp_header
);
551 ppp_cp_event(dev
, pid
, RUC
, 0, 0, len
, cp
);
557 dev
->stats
.rx_errors
++;
559 spin_unlock_irqrestore(&ppp
->lock
, flags
);
560 dev_kfree_skb_any(skb
);
565 static void ppp_timer(struct timer_list
*t
)
567 struct proto
*proto
= from_timer(proto
, t
, timer
);
568 struct ppp
*ppp
= get_ppp(proto
->dev
);
571 spin_lock_irqsave(&ppp
->lock
, flags
);
572 /* mod_timer could be called after we entered this function but
573 * before we got the lock.
575 if (timer_pending(&proto
->timer
)) {
576 spin_unlock_irqrestore(&ppp
->lock
, flags
);
579 switch (proto
->state
) {
584 if (proto
->restart_counter
) {
585 ppp_cp_event(proto
->dev
, proto
->pid
, TO_GOOD
, 0, 0,
587 proto
->restart_counter
--;
588 } else if (netif_carrier_ok(proto
->dev
))
589 ppp_cp_event(proto
->dev
, proto
->pid
, TO_GOOD
, 0, 0,
592 ppp_cp_event(proto
->dev
, proto
->pid
, TO_BAD
, 0, 0,
597 if (proto
->pid
!= PID_LCP
)
599 if (time_after(jiffies
, ppp
->last_pong
+
600 ppp
->keepalive_timeout
* HZ
)) {
601 netdev_info(proto
->dev
, "Link down\n");
602 ppp_cp_event(proto
->dev
, PID_LCP
, STOP
, 0, 0, 0, NULL
);
603 ppp_cp_event(proto
->dev
, PID_LCP
, START
, 0, 0, 0, NULL
);
604 } else { /* send keep-alive packet */
605 ppp
->echo_id
= ++ppp
->seq
;
606 ppp_tx_cp(proto
->dev
, PID_LCP
, LCP_ECHO_REQ
,
607 ppp
->echo_id
, 0, NULL
);
608 proto
->timer
.expires
= jiffies
+
609 ppp
->keepalive_interval
* HZ
;
610 add_timer(&proto
->timer
);
614 spin_unlock_irqrestore(&ppp
->lock
, flags
);
619 static void ppp_start(struct net_device
*dev
)
621 struct ppp
*ppp
= get_ppp(dev
);
624 for (i
= 0; i
< IDX_COUNT
; i
++) {
625 struct proto
*proto
= &ppp
->protos
[i
];
627 timer_setup(&proto
->timer
, ppp_timer
, 0);
628 proto
->state
= CLOSED
;
630 ppp
->protos
[IDX_LCP
].pid
= PID_LCP
;
631 ppp
->protos
[IDX_IPCP
].pid
= PID_IPCP
;
632 ppp
->protos
[IDX_IPV6CP
].pid
= PID_IPV6CP
;
634 ppp_cp_event(dev
, PID_LCP
, START
, 0, 0, 0, NULL
);
637 static void ppp_stop(struct net_device
*dev
)
639 ppp_cp_event(dev
, PID_LCP
, STOP
, 0, 0, 0, NULL
);
642 static void ppp_close(struct net_device
*dev
)
647 static struct hdlc_proto proto
= {
651 .type_trans
= ppp_type_trans
,
654 .module
= THIS_MODULE
,
657 static const struct header_ops ppp_header_ops
= {
658 .create
= ppp_hard_header
,
661 static int ppp_ioctl(struct net_device
*dev
, struct ifreq
*ifr
)
663 hdlc_device
*hdlc
= dev_to_hdlc(dev
);
667 switch (ifr
->ifr_settings
.type
) {
669 if (dev_to_hdlc(dev
)->proto
!= &proto
)
671 ifr
->ifr_settings
.type
= IF_PROTO_PPP
;
672 return 0; /* return protocol only, no settable parameters */
675 if (!capable(CAP_NET_ADMIN
))
678 if (dev
->flags
& IFF_UP
)
681 /* no settable parameters */
683 result
= hdlc
->attach(dev
, ENCODING_NRZ
,PARITY_CRC16_PR1_CCITT
);
687 result
= attach_hdlc_protocol(dev
, &proto
, sizeof(struct ppp
));
692 spin_lock_init(&ppp
->lock
);
693 ppp
->req_timeout
= 2;
694 ppp
->cr_retries
= 10;
695 ppp
->term_retries
= 2;
696 ppp
->keepalive_interval
= 10;
697 ppp
->keepalive_timeout
= 60;
699 dev
->hard_header_len
= sizeof(struct hdlc_header
);
700 dev
->header_ops
= &ppp_header_ops
;
701 dev
->type
= ARPHRD_PPP
;
702 call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE
, dev
);
703 netif_dormant_on(dev
);
711 static int __init
mod_init(void)
713 skb_queue_head_init(&tx_queue
);
714 register_hdlc_protocol(&proto
);
718 static void __exit
mod_exit(void)
720 unregister_hdlc_protocol(&proto
);
724 module_init(mod_init
);
725 module_exit(mod_exit
);
727 MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
728 MODULE_DESCRIPTION("PPP protocol support for generic HDLC");
729 MODULE_LICENSE("GPL v2");