0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/errno.h>
0010 #include <linux/hdlc.h>
0011 #include <linux/if_arp.h>
0012 #include <linux/inetdevice.h>
0013 #include <linux/init.h>
0014 #include <linux/kernel.h>
0015 #include <linux/module.h>
0016 #include <linux/pkt_sched.h>
0017 #include <linux/poll.h>
0018 #include <linux/skbuff.h>
0019 #include <linux/slab.h>
0020 #include <linux/spinlock.h>
0021
0022 #define DEBUG_CP 0
0023 #define DEBUG_STATE 0
0024 #define DEBUG_HARD_HEADER 0
0025
0026 #define HDLC_ADDR_ALLSTATIONS 0xFF
0027 #define HDLC_CTRL_UI 0x03
0028
0029 #define PID_LCP 0xC021
0030 #define PID_IP 0x0021
0031 #define PID_IPCP 0x8021
0032 #define PID_IPV6 0x0057
0033 #define PID_IPV6CP 0x8057
0034
0035 enum {IDX_LCP = 0, IDX_IPCP, IDX_IPV6CP, IDX_COUNT};
0036 enum {CP_CONF_REQ = 1, CP_CONF_ACK, CP_CONF_NAK, CP_CONF_REJ, CP_TERM_REQ,
0037 CP_TERM_ACK, CP_CODE_REJ, LCP_PROTO_REJ, LCP_ECHO_REQ, LCP_ECHO_REPLY,
0038 LCP_DISC_REQ, CP_CODES};
0039 #if DEBUG_CP
0040 static const char *const code_names[CP_CODES] = {
0041 "0", "ConfReq", "ConfAck", "ConfNak", "ConfRej", "TermReq",
0042 "TermAck", "CodeRej", "ProtoRej", "EchoReq", "EchoReply", "Discard"
0043 };
0044
0045 static char debug_buffer[64 + 3 * DEBUG_CP];
0046 #endif
0047
0048 enum {LCP_OPTION_MRU = 1, LCP_OPTION_ACCM, LCP_OPTION_MAGIC = 5};
0049
0050 struct hdlc_header {
0051 u8 address;
0052 u8 control;
0053 __be16 protocol;
0054 };
0055
0056 struct cp_header {
0057 u8 code;
0058 u8 id;
0059 __be16 len;
0060 };
0061
0062 struct proto {
0063 struct net_device *dev;
0064 struct timer_list timer;
0065 unsigned long timeout;
0066 u16 pid;
0067 u8 state;
0068 u8 cr_id;
0069 u8 restart_counter;
0070 };
0071
0072 struct ppp {
0073 struct proto protos[IDX_COUNT];
0074 spinlock_t lock;
0075 unsigned long last_pong;
0076 unsigned int req_timeout, cr_retries, term_retries;
0077 unsigned int keepalive_interval, keepalive_timeout;
0078 u8 seq;
0079 u8 echo_id;
0080 };
0081
0082 enum {CLOSED = 0, STOPPED, STOPPING, REQ_SENT, ACK_RECV, ACK_SENT, OPENED,
0083 STATES, STATE_MASK = 0xF};
0084 enum {START = 0, STOP, TO_GOOD, TO_BAD, RCR_GOOD, RCR_BAD, RCA, RCN, RTR, RTA,
0085 RUC, RXJ_GOOD, RXJ_BAD, EVENTS};
0086 enum {INV = 0x10, IRC = 0x20, ZRC = 0x40, SCR = 0x80, SCA = 0x100,
0087 SCN = 0x200, STR = 0x400, STA = 0x800, SCJ = 0x1000};
0088
0089 #if DEBUG_STATE
0090 static const char *const state_names[STATES] = {
0091 "Closed", "Stopped", "Stopping", "ReqSent", "AckRecv", "AckSent",
0092 "Opened"
0093 };
0094
0095 static const char *const event_names[EVENTS] = {
0096 "Start", "Stop", "TO+", "TO-", "RCR+", "RCR-", "RCA", "RCN",
0097 "RTR", "RTA", "RUC", "RXJ+", "RXJ-"
0098 };
0099 #endif
0100
0101 static struct sk_buff_head tx_queue;
0102
0103 static int ppp_ioctl(struct net_device *dev, struct if_settings *ifs);
0104
0105 static inline struct ppp *get_ppp(struct net_device *dev)
0106 {
0107 return (struct ppp *)dev_to_hdlc(dev)->state;
0108 }
0109
0110 static inline struct proto *get_proto(struct net_device *dev, u16 pid)
0111 {
0112 struct ppp *ppp = get_ppp(dev);
0113
0114 switch (pid) {
0115 case PID_LCP:
0116 return &ppp->protos[IDX_LCP];
0117 case PID_IPCP:
0118 return &ppp->protos[IDX_IPCP];
0119 case PID_IPV6CP:
0120 return &ppp->protos[IDX_IPV6CP];
0121 default:
0122 return NULL;
0123 }
0124 }
0125
0126 static inline const char *proto_name(u16 pid)
0127 {
0128 switch (pid) {
0129 case PID_LCP:
0130 return "LCP";
0131 case PID_IPCP:
0132 return "IPCP";
0133 case PID_IPV6CP:
0134 return "IPV6CP";
0135 default:
0136 return NULL;
0137 }
0138 }
0139
0140 static __be16 ppp_type_trans(struct sk_buff *skb, struct net_device *dev)
0141 {
0142 struct hdlc_header *data = (struct hdlc_header *)skb->data;
0143
0144 if (skb->len < sizeof(struct hdlc_header))
0145 return htons(ETH_P_HDLC);
0146 if (data->address != HDLC_ADDR_ALLSTATIONS ||
0147 data->control != HDLC_CTRL_UI)
0148 return htons(ETH_P_HDLC);
0149
0150 switch (data->protocol) {
0151 case cpu_to_be16(PID_IP):
0152 skb_pull(skb, sizeof(struct hdlc_header));
0153 return htons(ETH_P_IP);
0154
0155 case cpu_to_be16(PID_IPV6):
0156 skb_pull(skb, sizeof(struct hdlc_header));
0157 return htons(ETH_P_IPV6);
0158
0159 default:
0160 return htons(ETH_P_HDLC);
0161 }
0162 }
0163
0164 static int ppp_hard_header(struct sk_buff *skb, struct net_device *dev,
0165 u16 type, const void *daddr, const void *saddr,
0166 unsigned int len)
0167 {
0168 struct hdlc_header *data;
0169 #if DEBUG_HARD_HEADER
0170 printk(KERN_DEBUG "%s: ppp_hard_header() called\n", dev->name);
0171 #endif
0172
0173 skb_push(skb, sizeof(struct hdlc_header));
0174 data = (struct hdlc_header *)skb->data;
0175
0176 data->address = HDLC_ADDR_ALLSTATIONS;
0177 data->control = HDLC_CTRL_UI;
0178 switch (type) {
0179 case ETH_P_IP:
0180 data->protocol = htons(PID_IP);
0181 break;
0182 case ETH_P_IPV6:
0183 data->protocol = htons(PID_IPV6);
0184 break;
0185 case PID_LCP:
0186 case PID_IPCP:
0187 case PID_IPV6CP:
0188 data->protocol = htons(type);
0189 break;
0190 default:
0191 data->protocol = 0;
0192 }
0193 return sizeof(struct hdlc_header);
0194 }
0195
0196 static void ppp_tx_flush(void)
0197 {
0198 struct sk_buff *skb;
0199
0200 while ((skb = skb_dequeue(&tx_queue)) != NULL)
0201 dev_queue_xmit(skb);
0202 }
0203
0204 static void ppp_tx_cp(struct net_device *dev, u16 pid, u8 code,
0205 u8 id, unsigned int len, const void *data)
0206 {
0207 struct sk_buff *skb;
0208 struct cp_header *cp;
0209 unsigned int magic_len = 0;
0210 static u32 magic;
0211
0212 #if DEBUG_CP
0213 int i;
0214 char *ptr;
0215 #endif
0216
0217 if (pid == PID_LCP && (code == LCP_ECHO_REQ || code == LCP_ECHO_REPLY))
0218 magic_len = sizeof(magic);
0219
0220 skb = dev_alloc_skb(sizeof(struct hdlc_header) +
0221 sizeof(struct cp_header) + magic_len + len);
0222 if (!skb)
0223 return;
0224
0225 skb_reserve(skb, sizeof(struct hdlc_header));
0226
0227 cp = skb_put(skb, sizeof(struct cp_header));
0228 cp->code = code;
0229 cp->id = id;
0230 cp->len = htons(sizeof(struct cp_header) + magic_len + len);
0231
0232 if (magic_len)
0233 skb_put_data(skb, &magic, magic_len);
0234 if (len)
0235 skb_put_data(skb, data, len);
0236
0237 #if DEBUG_CP
0238 BUG_ON(code >= CP_CODES);
0239 ptr = debug_buffer;
0240 *ptr = '\x0';
0241 for (i = 0; i < min_t(unsigned int, magic_len + len, DEBUG_CP); i++) {
0242 sprintf(ptr, " %02X", skb->data[sizeof(struct cp_header) + i]);
0243 ptr += strlen(ptr);
0244 }
0245 printk(KERN_DEBUG "%s: TX %s [%s id 0x%X]%s\n", dev->name,
0246 proto_name(pid), code_names[code], id, debug_buffer);
0247 #endif
0248
0249 ppp_hard_header(skb, dev, pid, NULL, NULL, 0);
0250
0251 skb->priority = TC_PRIO_CONTROL;
0252 skb->dev = dev;
0253 skb->protocol = htons(ETH_P_HDLC);
0254 skb_reset_network_header(skb);
0255 skb_queue_tail(&tx_queue, skb);
0256 }
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277 static int cp_table[EVENTS][STATES] = {
0278
0279
0280 {IRC|SCR|3, INV , INV , INV , INV , INV , INV },
0281 { INV , 0 , 0 , 0 , 0 , 0 , 0 },
0282 { INV , INV ,STR|2, SCR|3 ,SCR|3, SCR|5 , INV },
0283 { INV , INV , 1 , 1 , 1 , 1 , INV },
0284 { STA|0 ,IRC|SCR|SCA|5, 2 , SCA|5 ,SCA|6, SCA|5 ,SCR|SCA|5},
0285 { STA|0 ,IRC|SCR|SCN|3, 2 , SCN|3 ,SCN|4, SCN|3 ,SCR|SCN|3},
0286 { STA|0 , STA|1 , 2 , IRC|4 ,SCR|3, 6 , SCR|3 },
0287 { STA|0 , STA|1 , 2 ,IRC|SCR|3,SCR|3,IRC|SCR|5, SCR|3 },
0288 { STA|0 , STA|1 ,STA|2, STA|3 ,STA|3, STA|3 ,ZRC|STA|2},
0289 { 0 , 1 , 1 , 3 , 3 , 5 , SCR|3 },
0290 { SCJ|0 , SCJ|1 ,SCJ|2, SCJ|3 ,SCJ|4, SCJ|5 , SCJ|6 },
0291 { 0 , 1 , 2 , 3 , 3 , 5 , 6 },
0292 { 0 , 1 , 1 , 1 , 1 , 1 ,IRC|STR|2},
0293 };
0294
0295
0296
0297
0298
0299 static void ppp_cp_event(struct net_device *dev, u16 pid, u16 event, u8 code,
0300 u8 id, unsigned int len, const void *data)
0301 {
0302 int old_state, action;
0303 struct ppp *ppp = get_ppp(dev);
0304 struct proto *proto = get_proto(dev, pid);
0305
0306 old_state = proto->state;
0307 BUG_ON(old_state >= STATES);
0308 BUG_ON(event >= EVENTS);
0309
0310 #if DEBUG_STATE
0311 printk(KERN_DEBUG "%s: %s ppp_cp_event(%s) %s ...\n", dev->name,
0312 proto_name(pid), event_names[event], state_names[proto->state]);
0313 #endif
0314
0315 action = cp_table[event][old_state];
0316
0317 proto->state = action & STATE_MASK;
0318 if (action & (SCR | STR))
0319 mod_timer(&proto->timer, proto->timeout =
0320 jiffies + ppp->req_timeout * HZ);
0321 if (action & ZRC)
0322 proto->restart_counter = 0;
0323 if (action & IRC)
0324 proto->restart_counter = (proto->state == STOPPING) ?
0325 ppp->term_retries : ppp->cr_retries;
0326
0327 if (action & SCR)
0328 ppp_tx_cp(dev, pid, CP_CONF_REQ, proto->cr_id = ++ppp->seq,
0329 0, NULL);
0330 if (action & SCA)
0331 ppp_tx_cp(dev, pid, CP_CONF_ACK, id, len, data);
0332 if (action & SCN)
0333 ppp_tx_cp(dev, pid, code, id, len, data);
0334 if (action & STR)
0335 ppp_tx_cp(dev, pid, CP_TERM_REQ, ++ppp->seq, 0, NULL);
0336 if (action & STA)
0337 ppp_tx_cp(dev, pid, CP_TERM_ACK, id, 0, NULL);
0338 if (action & SCJ)
0339 ppp_tx_cp(dev, pid, CP_CODE_REJ, ++ppp->seq, len, data);
0340
0341 if (old_state != OPENED && proto->state == OPENED) {
0342 netdev_info(dev, "%s up\n", proto_name(pid));
0343 if (pid == PID_LCP) {
0344 netif_dormant_off(dev);
0345 ppp_cp_event(dev, PID_IPCP, START, 0, 0, 0, NULL);
0346 ppp_cp_event(dev, PID_IPV6CP, START, 0, 0, 0, NULL);
0347 ppp->last_pong = jiffies;
0348 mod_timer(&proto->timer, proto->timeout =
0349 jiffies + ppp->keepalive_interval * HZ);
0350 }
0351 }
0352 if (old_state == OPENED && proto->state != OPENED) {
0353 netdev_info(dev, "%s down\n", proto_name(pid));
0354 if (pid == PID_LCP) {
0355 netif_dormant_on(dev);
0356 ppp_cp_event(dev, PID_IPCP, STOP, 0, 0, 0, NULL);
0357 ppp_cp_event(dev, PID_IPV6CP, STOP, 0, 0, 0, NULL);
0358 }
0359 }
0360 if (old_state != CLOSED && proto->state == CLOSED)
0361 del_timer(&proto->timer);
0362
0363 #if DEBUG_STATE
0364 printk(KERN_DEBUG "%s: %s ppp_cp_event(%s) ... %s\n", dev->name,
0365 proto_name(pid), event_names[event], state_names[proto->state]);
0366 #endif
0367 }
0368
0369 static void ppp_cp_parse_cr(struct net_device *dev, u16 pid, u8 id,
0370 unsigned int req_len, const u8 *data)
0371 {
0372 static u8 const valid_accm[6] = { LCP_OPTION_ACCM, 6, 0, 0, 0, 0 };
0373 const u8 *opt;
0374 u8 *out;
0375 unsigned int len = req_len, nak_len = 0, rej_len = 0;
0376
0377 out = kmalloc(len, GFP_ATOMIC);
0378 if (!out) {
0379 dev->stats.rx_dropped++;
0380 return;
0381 }
0382
0383 for (opt = data; len; len -= opt[1], opt += opt[1]) {
0384 if (len < 2 || opt[1] < 2 || len < opt[1])
0385 goto err_out;
0386
0387 if (pid == PID_LCP)
0388 switch (opt[0]) {
0389 case LCP_OPTION_MRU:
0390 continue;
0391
0392 case LCP_OPTION_ACCM:
0393 if (opt[1] < sizeof(valid_accm))
0394 goto err_out;
0395 if (!memcmp(opt, valid_accm,
0396 sizeof(valid_accm)))
0397 continue;
0398 if (!rej_len) {
0399 memcpy(out + nak_len, valid_accm,
0400 sizeof(valid_accm));
0401 nak_len += sizeof(valid_accm);
0402 continue;
0403 }
0404 break;
0405 case LCP_OPTION_MAGIC:
0406 if (len < 6)
0407 goto err_out;
0408 if (opt[1] != 6 || (!opt[2] && !opt[3] &&
0409 !opt[4] && !opt[5]))
0410 break;
0411 continue;
0412 }
0413
0414 memcpy(out + rej_len, opt, opt[1]);
0415 rej_len += opt[1];
0416 }
0417
0418 if (rej_len)
0419 ppp_cp_event(dev, pid, RCR_BAD, CP_CONF_REJ, id, rej_len, out);
0420 else if (nak_len)
0421 ppp_cp_event(dev, pid, RCR_BAD, CP_CONF_NAK, id, nak_len, out);
0422 else
0423 ppp_cp_event(dev, pid, RCR_GOOD, CP_CONF_ACK, id, req_len, data);
0424
0425 kfree(out);
0426 return;
0427
0428 err_out:
0429 dev->stats.rx_errors++;
0430 kfree(out);
0431 }
0432
0433 static int ppp_rx(struct sk_buff *skb)
0434 {
0435 struct hdlc_header *hdr = (struct hdlc_header *)skb->data;
0436 struct net_device *dev = skb->dev;
0437 struct ppp *ppp = get_ppp(dev);
0438 struct proto *proto;
0439 struct cp_header *cp;
0440 unsigned long flags;
0441 unsigned int len;
0442 u16 pid;
0443 #if DEBUG_CP
0444 int i;
0445 char *ptr;
0446 #endif
0447
0448 spin_lock_irqsave(&ppp->lock, flags);
0449
0450 if (skb->len < sizeof(struct hdlc_header))
0451 goto rx_error;
0452 cp = skb_pull(skb, sizeof(struct hdlc_header));
0453 if (hdr->address != HDLC_ADDR_ALLSTATIONS ||
0454 hdr->control != HDLC_CTRL_UI)
0455 goto rx_error;
0456
0457 pid = ntohs(hdr->protocol);
0458 proto = get_proto(dev, pid);
0459 if (!proto) {
0460 if (ppp->protos[IDX_LCP].state == OPENED)
0461 ppp_tx_cp(dev, PID_LCP, LCP_PROTO_REJ,
0462 ++ppp->seq, skb->len + 2, &hdr->protocol);
0463 goto rx_error;
0464 }
0465
0466 len = ntohs(cp->len);
0467 if (len < sizeof(struct cp_header) ||
0468 skb->len < len )
0469 goto rx_error;
0470 skb_pull(skb, sizeof(struct cp_header));
0471 len -= sizeof(struct cp_header);
0472
0473
0474 #if DEBUG_CP
0475 if (cp->code < CP_CODES)
0476 sprintf(debug_buffer, "[%s id 0x%X]", code_names[cp->code],
0477 cp->id);
0478 else
0479 sprintf(debug_buffer, "[code %u id 0x%X]", cp->code, cp->id);
0480 ptr = debug_buffer + strlen(debug_buffer);
0481 for (i = 0; i < min_t(unsigned int, len, DEBUG_CP); i++) {
0482 sprintf(ptr, " %02X", skb->data[i]);
0483 ptr += strlen(ptr);
0484 }
0485 printk(KERN_DEBUG "%s: RX %s %s\n", dev->name, proto_name(pid),
0486 debug_buffer);
0487 #endif
0488
0489
0490 if (pid == PID_LCP)
0491 switch (cp->code) {
0492 case LCP_PROTO_REJ:
0493 pid = ntohs(*(__be16 *)skb->data);
0494 if (pid == PID_LCP || pid == PID_IPCP ||
0495 pid == PID_IPV6CP)
0496 ppp_cp_event(dev, pid, RXJ_BAD, 0, 0,
0497 0, NULL);
0498 goto out;
0499
0500 case LCP_ECHO_REQ:
0501 if (len >= 4 && proto->state == OPENED)
0502 ppp_tx_cp(dev, PID_LCP, LCP_ECHO_REPLY,
0503 cp->id, len - 4, skb->data + 4);
0504 goto out;
0505
0506 case LCP_ECHO_REPLY:
0507 if (cp->id == ppp->echo_id)
0508 ppp->last_pong = jiffies;
0509 goto out;
0510
0511 case LCP_DISC_REQ:
0512 goto out;
0513 }
0514
0515
0516 switch (cp->code) {
0517 case CP_CONF_REQ:
0518 ppp_cp_parse_cr(dev, pid, cp->id, len, skb->data);
0519 break;
0520
0521 case CP_CONF_ACK:
0522 if (cp->id == proto->cr_id)
0523 ppp_cp_event(dev, pid, RCA, 0, 0, 0, NULL);
0524 break;
0525
0526 case CP_CONF_REJ:
0527 case CP_CONF_NAK:
0528 if (cp->id == proto->cr_id)
0529 ppp_cp_event(dev, pid, RCN, 0, 0, 0, NULL);
0530 break;
0531
0532 case CP_TERM_REQ:
0533 ppp_cp_event(dev, pid, RTR, 0, cp->id, 0, NULL);
0534 break;
0535
0536 case CP_TERM_ACK:
0537 ppp_cp_event(dev, pid, RTA, 0, 0, 0, NULL);
0538 break;
0539
0540 case CP_CODE_REJ:
0541 ppp_cp_event(dev, pid, RXJ_BAD, 0, 0, 0, NULL);
0542 break;
0543
0544 default:
0545 len += sizeof(struct cp_header);
0546 if (len > dev->mtu)
0547 len = dev->mtu;
0548 ppp_cp_event(dev, pid, RUC, 0, 0, len, cp);
0549 break;
0550 }
0551 goto out;
0552
0553 rx_error:
0554 dev->stats.rx_errors++;
0555 out:
0556 spin_unlock_irqrestore(&ppp->lock, flags);
0557 dev_kfree_skb_any(skb);
0558 ppp_tx_flush();
0559 return NET_RX_DROP;
0560 }
0561
0562 static void ppp_timer(struct timer_list *t)
0563 {
0564 struct proto *proto = from_timer(proto, t, timer);
0565 struct ppp *ppp = get_ppp(proto->dev);
0566 unsigned long flags;
0567
0568 spin_lock_irqsave(&ppp->lock, flags);
0569
0570
0571
0572 if (timer_pending(&proto->timer)) {
0573 spin_unlock_irqrestore(&ppp->lock, flags);
0574 return;
0575 }
0576 switch (proto->state) {
0577 case STOPPING:
0578 case REQ_SENT:
0579 case ACK_RECV:
0580 case ACK_SENT:
0581 if (proto->restart_counter) {
0582 ppp_cp_event(proto->dev, proto->pid, TO_GOOD, 0, 0,
0583 0, NULL);
0584 proto->restart_counter--;
0585 } else if (netif_carrier_ok(proto->dev))
0586 ppp_cp_event(proto->dev, proto->pid, TO_GOOD, 0, 0,
0587 0, NULL);
0588 else
0589 ppp_cp_event(proto->dev, proto->pid, TO_BAD, 0, 0,
0590 0, NULL);
0591 break;
0592
0593 case OPENED:
0594 if (proto->pid != PID_LCP)
0595 break;
0596 if (time_after(jiffies, ppp->last_pong +
0597 ppp->keepalive_timeout * HZ)) {
0598 netdev_info(proto->dev, "Link down\n");
0599 ppp_cp_event(proto->dev, PID_LCP, STOP, 0, 0, 0, NULL);
0600 ppp_cp_event(proto->dev, PID_LCP, START, 0, 0, 0, NULL);
0601 } else {
0602 ppp->echo_id = ++ppp->seq;
0603 ppp_tx_cp(proto->dev, PID_LCP, LCP_ECHO_REQ,
0604 ppp->echo_id, 0, NULL);
0605 proto->timer.expires = jiffies +
0606 ppp->keepalive_interval * HZ;
0607 add_timer(&proto->timer);
0608 }
0609 break;
0610 }
0611 spin_unlock_irqrestore(&ppp->lock, flags);
0612 ppp_tx_flush();
0613 }
0614
0615 static void ppp_start(struct net_device *dev)
0616 {
0617 struct ppp *ppp = get_ppp(dev);
0618 int i;
0619
0620 for (i = 0; i < IDX_COUNT; i++) {
0621 struct proto *proto = &ppp->protos[i];
0622
0623 proto->dev = dev;
0624 timer_setup(&proto->timer, ppp_timer, 0);
0625 proto->state = CLOSED;
0626 }
0627 ppp->protos[IDX_LCP].pid = PID_LCP;
0628 ppp->protos[IDX_IPCP].pid = PID_IPCP;
0629 ppp->protos[IDX_IPV6CP].pid = PID_IPV6CP;
0630
0631 ppp_cp_event(dev, PID_LCP, START, 0, 0, 0, NULL);
0632 }
0633
0634 static void ppp_stop(struct net_device *dev)
0635 {
0636 ppp_cp_event(dev, PID_LCP, STOP, 0, 0, 0, NULL);
0637 }
0638
0639 static void ppp_close(struct net_device *dev)
0640 {
0641 ppp_tx_flush();
0642 }
0643
0644 static struct hdlc_proto proto = {
0645 .start = ppp_start,
0646 .stop = ppp_stop,
0647 .close = ppp_close,
0648 .type_trans = ppp_type_trans,
0649 .ioctl = ppp_ioctl,
0650 .netif_rx = ppp_rx,
0651 .module = THIS_MODULE,
0652 };
0653
0654 static const struct header_ops ppp_header_ops = {
0655 .create = ppp_hard_header,
0656 };
0657
0658 static int ppp_ioctl(struct net_device *dev, struct if_settings *ifs)
0659 {
0660 hdlc_device *hdlc = dev_to_hdlc(dev);
0661 struct ppp *ppp;
0662 int result;
0663
0664 switch (ifs->type) {
0665 case IF_GET_PROTO:
0666 if (dev_to_hdlc(dev)->proto != &proto)
0667 return -EINVAL;
0668 ifs->type = IF_PROTO_PPP;
0669 return 0;
0670
0671 case IF_PROTO_PPP:
0672 if (!capable(CAP_NET_ADMIN))
0673 return -EPERM;
0674
0675 if (dev->flags & IFF_UP)
0676 return -EBUSY;
0677
0678
0679
0680 result = hdlc->attach(dev, ENCODING_NRZ,
0681 PARITY_CRC16_PR1_CCITT);
0682 if (result)
0683 return result;
0684
0685 result = attach_hdlc_protocol(dev, &proto, sizeof(struct ppp));
0686 if (result)
0687 return result;
0688
0689 ppp = get_ppp(dev);
0690 spin_lock_init(&ppp->lock);
0691 ppp->req_timeout = 2;
0692 ppp->cr_retries = 10;
0693 ppp->term_retries = 2;
0694 ppp->keepalive_interval = 10;
0695 ppp->keepalive_timeout = 60;
0696
0697 dev->hard_header_len = sizeof(struct hdlc_header);
0698 dev->header_ops = &ppp_header_ops;
0699 dev->type = ARPHRD_PPP;
0700 call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
0701 netif_dormant_on(dev);
0702 return 0;
0703 }
0704
0705 return -EINVAL;
0706 }
0707
0708 static int __init hdlc_ppp_init(void)
0709 {
0710 skb_queue_head_init(&tx_queue);
0711 register_hdlc_protocol(&proto);
0712 return 0;
0713 }
0714
0715 static void __exit hdlc_ppp_exit(void)
0716 {
0717 unregister_hdlc_protocol(&proto);
0718 }
0719
0720 module_init(hdlc_ppp_init);
0721 module_exit(hdlc_ppp_exit);
0722
0723 MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
0724 MODULE_DESCRIPTION("PPP protocol support for generic HDLC");
0725 MODULE_LICENSE("GPL v2");