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