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