1/* 2 * NET3: Support for 802.2 demultiplexing off Ethernet 3 * This program is free software; you can redistribute it and/or 4 * modify it under the terms of the GNU General Public License 5 * as published by the Free Software Foundation; either version 6 * 2 of the License, or (at your option) any later version. 7 * 8 * Demultiplex 802.2 encoded protocols. We match the entry by the 9 * SSAP/DSAP pair and then deliver to the registered datalink that 10 * matches. The control byte is ignored and handling of such items 11 * is up to the routine passed the frame. 12 * 13 * Unlike the 802.3 datalink we have a list of 802.2 entries as 14 * there are multiple protocols to demux. The list is currently 15 * short (3 or 4 entries at most). The current demux assumes this. 16 */ 17#include <linux/module.h> 18#include <linux/netdevice.h> 19#include <linux/skbuff.h> 20#include <linux/slab.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 28static 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 35struct 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 struct net_device *orig_dev)) 40{ 41 struct datalink_proto *proto; 42 43 proto = kmalloc(sizeof(*proto), GFP_ATOMIC); 44 if (proto) { 45 proto->type[0] = type; 46 proto->header_length = 3; 47 proto->request = p8022_request; 48 proto->sap = llc_sap_open(type, func); 49 if (!proto->sap) { 50 kfree(proto); 51 proto = NULL; 52 } 53 } 54 return proto; 55} 56 57void unregister_8022_client(struct datalink_proto *proto) 58{ 59 llc_sap_put(proto->sap); 60 kfree(proto); 61} 62 63EXPORT_SYMBOL(register_8022_client); 64EXPORT_SYMBOL(unregister_8022_client); 65 66MODULE_LICENSE("GPL"); 67