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