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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [net/] [802/] [psnap.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *      SNAP data link layer. Derived from 802.2
3
 *
4
 *              Alan Cox <Alan.Cox@linux.org>, from the 802.2 layer by Greg Page.
5
 *              Merged in additions from Greg Page's psnap.c.
6
 *
7
 *              This program is free software; you can redistribute it and/or
8
 *              modify it under the terms of the GNU General Public License
9
 *              as published by the Free Software Foundation; either version
10
 *              2 of the License, or (at your option) any later version.
11
 */
12
 
13
#include <linux/module.h>
14
#include <linux/netdevice.h>
15
#include <linux/skbuff.h>
16
#include <net/datalink.h>
17
#include <net/p8022.h>
18
#include <net/psnap.h>
19
#include <linux/mm.h>
20
#include <linux/in.h>
21
#include <linux/init.h>
22
 
23
static struct datalink_proto *snap_list = NULL;
24
static struct datalink_proto *snap_dl = NULL;           /* 802.2 DL for SNAP */
25
 
26
/*
27
 *      Find a snap client by matching the 5 bytes.
28
 */
29
 
30
static struct datalink_proto *find_snap_client(unsigned char *desc)
31
{
32
        struct datalink_proto   *proto;
33
 
34
        for (proto = snap_list; proto != NULL && memcmp(proto->type, desc, 5) ; proto = proto->next);
35
        return proto;
36
}
37
 
38
/*
39
 *      A SNAP packet has arrived
40
 */
41
 
42
int snap_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt)
43
{
44
        static struct packet_type psnap_packet_type =
45
        {
46
                0,
47
                NULL,           /* All Devices */
48
                snap_rcv,
49
                NULL,
50
                NULL,
51
        };
52
 
53
        struct datalink_proto   *proto;
54
 
55
        proto = find_snap_client(skb->h.raw);
56
        if (proto != NULL)
57
        {
58
                /*
59
                 *      Pass the frame on.
60
                 */
61
 
62
                skb->h.raw += 5;
63
                skb->nh.raw += 5;
64
                skb_pull(skb,5);
65
                if (psnap_packet_type.type == 0)
66
                        psnap_packet_type.type=htons(ETH_P_SNAP);
67
 
68
                return proto->rcvfunc(skb, dev, &psnap_packet_type);
69
        }
70
        skb->sk = NULL;
71
        kfree_skb(skb);
72
        return 0;
73
}
74
 
75
/*
76
 *      Put a SNAP header on a frame and pass to 802.2
77
 */
78
 
79
static void snap_datalink_header(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest_node)
80
{
81
        memcpy(skb_push(skb,5),dl->type,5);
82
        snap_dl->datalink_header(snap_dl, skb, dest_node);
83
}
84
 
85
/*
86
 *      Set up the SNAP layer
87
 */
88
 
89
EXPORT_SYMBOL(register_snap_client);
90
EXPORT_SYMBOL(unregister_snap_client);
91
 
92
static int __init snap_init(void)
93
{
94
        snap_dl=register_8022_client(0xAA, snap_rcv);
95
        if(snap_dl==NULL)
96
                printk("SNAP - unable to register with 802.2\n");
97
        return 0;
98
}
99
module_init(snap_init);
100
 
101
/*
102
 *      Register SNAP clients. We don't yet use this for IP.
103
 */
104
 
105
struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct net_device *, struct packet_type *))
106
{
107
        struct datalink_proto   *proto;
108
 
109
        if (find_snap_client(desc) != NULL)
110
                return NULL;
111
 
112
        proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC);
113
        if (proto != NULL)
114
        {
115
                memcpy(proto->type, desc,5);
116
                proto->type_len = 5;
117
                proto->rcvfunc = rcvfunc;
118
                proto->header_length = 5+snap_dl->header_length;
119
                proto->datalink_header = snap_datalink_header;
120
                proto->string_name = "SNAP";
121
                proto->next = snap_list;
122
                snap_list = proto;
123
        }
124
 
125
        return proto;
126
}
127
 
128
/*
129
 *      Unregister SNAP clients. Protocols no longer want to play with us ...
130
 */
131
 
132
void unregister_snap_client(unsigned char *desc)
133
{
134
        struct datalink_proto **clients = &snap_list;
135
        struct datalink_proto *tmp;
136
        unsigned long flags;
137
 
138
        save_flags(flags);
139
        cli();
140
 
141
        while ((tmp = *clients) != NULL)
142
        {
143
                if (memcmp(tmp->type,desc,5) == 0)
144
                {
145
                        *clients = tmp->next;
146
                        kfree(tmp);
147
                        break;
148
                }
149
                else
150
                        clients = &tmp->next;
151
        }
152
 
153
        restore_flags(flags);
154
}

powered by: WebSVN 2.1.0

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