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 <linux/slab.h> 22 #include <net/datalink.h> 23 #include <linux/mm.h> 24 #include <linux/in.h> 25 #include <linux/init.h> 26 #include <net/llc.h> 27 #include <net/p8022.h> 28 29 static int p8022_request(struct datalink_proto *dl, struct sk_buff *skb, 30 unsigned char *dest) 31 { 32 llc_build_and_send_ui_pkt(dl->sap, skb, dest, dl->sap->laddr.lsap); 33 return 0; 34 } 35 36 struct datalink_proto *register_8022_client(unsigned char type, 37 int (*func)(struct sk_buff *skb, 38 struct net_device *dev, 39 struct packet_type *pt, 40 struct net_device *orig_dev)) 41 { 42 struct datalink_proto *proto; 43 44 proto = kmalloc(sizeof(*proto), GFP_ATOMIC); 45 if (proto) { 46 proto->type[0] = type; 47 proto->header_length = 3; 48 proto->request = p8022_request; 49 proto->sap = llc_sap_open(type, func); 50 if (!proto->sap) { 51 kfree(proto); 52 proto = NULL; 53 } 54 } 55 return proto; 56 } 57 58 void unregister_8022_client(struct datalink_proto *proto) 59 { 60 llc_sap_put(proto->sap); 61 kfree(proto); 62 } 63 64 EXPORT_SYMBOL(register_8022_client); 65 EXPORT_SYMBOL(unregister_8022_client); 66 67 MODULE_LICENSE("GPL"); 68