linux/net/802/p8022.c
<<
>>
Prefs
   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                         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");
  64