diff options
Diffstat (limited to 'net/802/p8022.c')
-rw-r--r-- | net/802/p8022.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/net/802/p8022.c b/net/802/p8022.c new file mode 100644 index 000000000000..5ae63416df6d --- /dev/null +++ b/net/802/p8022.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * NET3: Support for 802.2 demultiplexing off Ethernet (Token ring | ||
3 | * is kept separate see p8022tr.c) | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public License | ||
6 | * as published by the Free Software Foundation; either version | ||
7 | * 2 of the License, or (at your option) any later version. | ||
8 | * | ||
9 | * Demultiplex 802.2 encoded protocols. We match the entry by the | ||
10 | * SSAP/DSAP pair and then deliver to the registered datalink that | ||
11 | * matches. The control byte is ignored and handling of such items | ||
12 | * is up to the routine passed the frame. | ||
13 | * | ||
14 | * Unlike the 802.3 datalink we have a list of 802.2 entries as | ||
15 | * there are multiple protocols to demux. The list is currently | ||
16 | * short (3 or 4 entries at most). The current demux assumes this. | ||
17 | */ | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/netdevice.h> | ||
20 | #include <linux/skbuff.h> | ||
21 | #include <net/datalink.h> | ||
22 | #include <linux/mm.h> | ||
23 | #include <linux/in.h> | ||
24 | #include <linux/init.h> | ||
25 | #include <net/llc.h> | ||
26 | #include <net/p8022.h> | ||
27 | |||
28 | static int p8022_request(struct datalink_proto *dl, struct sk_buff *skb, | ||
29 | unsigned char *dest) | ||
30 | { | ||
31 | llc_build_and_send_ui_pkt(dl->sap, skb, dest, dl->sap->laddr.lsap); | ||
32 | return 0; | ||
33 | } | ||
34 | |||
35 | struct datalink_proto *register_8022_client(unsigned char type, | ||
36 | int (*func)(struct sk_buff *skb, | ||
37 | struct net_device *dev, | ||
38 | struct packet_type *pt)) | ||
39 | { | ||
40 | struct datalink_proto *proto; | ||
41 | |||
42 | proto = kmalloc(sizeof(*proto), GFP_ATOMIC); | ||
43 | if (proto) { | ||
44 | proto->type[0] = type; | ||
45 | proto->header_length = 3; | ||
46 | proto->request = p8022_request; | ||
47 | proto->sap = llc_sap_open(type, func); | ||
48 | if (!proto->sap) { | ||
49 | kfree(proto); | ||
50 | proto = NULL; | ||
51 | } | ||
52 | } | ||
53 | return proto; | ||
54 | } | ||
55 | |||
56 | void unregister_8022_client(struct datalink_proto *proto) | ||
57 | { | ||
58 | llc_sap_close(proto->sap); | ||
59 | kfree(proto); | ||
60 | } | ||
61 | |||
62 | EXPORT_SYMBOL(register_8022_client); | ||
63 | EXPORT_SYMBOL(unregister_8022_client); | ||
64 | |||
65 | MODULE_LICENSE("GPL"); | ||