OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [drivers/] [net/] [wan/] [hdlc_ppp.c] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Generic HDLC support routines for Linux
3
 * Point-to-point protocol support
4
 *
5
 * Copyright (C) 1999 - 2006 Krzysztof Halasa <khc@pm.waw.pl>
6
 *
7
 * This program is free software; you can redistribute it and/or modify it
8
 * under the terms of version 2 of the GNU General Public License
9
 * as published by the Free Software Foundation.
10
 */
11
 
12
#include <linux/module.h>
13
#include <linux/kernel.h>
14
#include <linux/slab.h>
15
#include <linux/poll.h>
16
#include <linux/errno.h>
17
#include <linux/if_arp.h>
18
#include <linux/init.h>
19
#include <linux/skbuff.h>
20
#include <linux/pkt_sched.h>
21
#include <linux/inetdevice.h>
22
#include <linux/lapb.h>
23
#include <linux/rtnetlink.h>
24
#include <linux/hdlc.h>
25
#include <net/syncppp.h>
26
 
27
struct ppp_state {
28
        struct ppp_device pppdev;
29
        struct ppp_device *syncppp_ptr;
30
        int (*old_change_mtu)(struct net_device *dev, int new_mtu);
31
};
32
 
33
static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr);
34
 
35
 
36
static inline struct ppp_state* state(hdlc_device *hdlc)
37
{
38
        return(struct ppp_state *)(hdlc->state);
39
}
40
 
41
 
42
static int ppp_open(struct net_device *dev)
43
{
44
        hdlc_device *hdlc = dev_to_hdlc(dev);
45
        void *old_ioctl;
46
        int result;
47
 
48
        dev->priv = &state(hdlc)->syncppp_ptr;
49
        state(hdlc)->syncppp_ptr = &state(hdlc)->pppdev;
50
        state(hdlc)->pppdev.dev = dev;
51
 
52
        old_ioctl = dev->do_ioctl;
53
        state(hdlc)->old_change_mtu = dev->change_mtu;
54
        sppp_attach(&state(hdlc)->pppdev);
55
        /* sppp_attach nukes them. We don't need syncppp's ioctl */
56
        dev->do_ioctl = old_ioctl;
57
        state(hdlc)->pppdev.sppp.pp_flags &= ~PP_CISCO;
58
        dev->type = ARPHRD_PPP;
59
        result = sppp_open(dev);
60
        if (result) {
61
                sppp_detach(dev);
62
                return result;
63
        }
64
 
65
        return 0;
66
}
67
 
68
 
69
 
70
static void ppp_close(struct net_device *dev)
71
{
72
        hdlc_device *hdlc = dev_to_hdlc(dev);
73
 
74
        sppp_close(dev);
75
        sppp_detach(dev);
76
 
77
        dev->change_mtu = state(hdlc)->old_change_mtu;
78
        dev->mtu = HDLC_MAX_MTU;
79
        dev->hard_header_len = 16;
80
}
81
 
82
 
83
 
84
static __be16 ppp_type_trans(struct sk_buff *skb, struct net_device *dev)
85
{
86
        return __constant_htons(ETH_P_WAN_PPP);
87
}
88
 
89
 
90
 
91
static struct hdlc_proto proto = {
92
        .open           = ppp_open,
93
        .close          = ppp_close,
94
        .type_trans     = ppp_type_trans,
95
        .ioctl          = ppp_ioctl,
96
        .module         = THIS_MODULE,
97
};
98
 
99
 
100
static int ppp_ioctl(struct net_device *dev, struct ifreq *ifr)
101
{
102
        hdlc_device *hdlc = dev_to_hdlc(dev);
103
        int result;
104
 
105
        switch (ifr->ifr_settings.type) {
106
        case IF_GET_PROTO:
107
                if (dev_to_hdlc(dev)->proto != &proto)
108
                        return -EINVAL;
109
                ifr->ifr_settings.type = IF_PROTO_PPP;
110
                return 0; /* return protocol only, no settable parameters */
111
 
112
        case IF_PROTO_PPP:
113
                if(!capable(CAP_NET_ADMIN))
114
                        return -EPERM;
115
 
116
                if(dev->flags & IFF_UP)
117
                        return -EBUSY;
118
 
119
                /* no settable parameters */
120
 
121
                result=hdlc->attach(dev, ENCODING_NRZ,PARITY_CRC16_PR1_CCITT);
122
                if (result)
123
                        return result;
124
 
125
                result = attach_hdlc_protocol(dev, &proto, NULL,
126
                                              sizeof(struct ppp_state));
127
                if (result)
128
                        return result;
129
                dev->hard_start_xmit = hdlc->xmit;
130
                dev->type = ARPHRD_PPP;
131
                netif_dormant_off(dev);
132
                return 0;
133
        }
134
 
135
        return -EINVAL;
136
}
137
 
138
 
139
static int __init mod_init(void)
140
{
141
        register_hdlc_protocol(&proto);
142
        return 0;
143
}
144
 
145
 
146
 
147
static void __exit mod_exit(void)
148
{
149
        unregister_hdlc_protocol(&proto);
150
}
151
 
152
 
153
module_init(mod_init);
154
module_exit(mod_exit);
155
 
156
MODULE_AUTHOR("Krzysztof Halasa <khc@pm.waw.pl>");
157
MODULE_DESCRIPTION("PPP protocol support for generic HDLC");
158
MODULE_LICENSE("GPL v2");

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.