p8022.c (1703B)
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 25static int p8022_request(struct datalink_proto *dl, struct sk_buff *skb, 26 const unsigned char *dest) 27{ 28 llc_build_and_send_ui_pkt(dl->sap, skb, dest, dl->sap->laddr.lsap); 29 return 0; 30} 31 32struct 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 54void unregister_8022_client(struct datalink_proto *proto) 55{ 56 llc_sap_put(proto->sap); 57 kfree(proto); 58} 59 60EXPORT_SYMBOL(register_8022_client); 61EXPORT_SYMBOL(unregister_8022_client); 62 63MODULE_LICENSE("GPL");