This source file includes following definitions.
- find_snap_client
 
- snap_rcv
 
- snap_datalink_header
 
- snap_proto_init
 
- register_snap_client
 
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12  
  13 #include <linux/netdevice.h>
  14 #include <linux/skbuff.h>
  15 #include <net/datalink.h>
  16 #include <net/p8022.h>
  17 #include <net/psnap.h>
  18 #include <linux/mm.h>
  19 #include <linux/in.h>
  20 
  21 static struct datalink_proto *snap_list = NULL;
  22 static struct datalink_proto *snap_dl = NULL;           
  23 
  24 
  25 
  26 
  27  
  28 static struct datalink_proto *find_snap_client(unsigned char *desc)
     
  29 {
  30         struct datalink_proto   *proto;
  31 
  32         for (proto = snap_list; proto != NULL && memcmp(proto->type, desc, 5) ; proto = proto->next);
  33         return proto;
  34 }
  35 
  36 
  37 
  38 
  39  
  40 int snap_rcv(struct sk_buff *skb, struct device *dev, struct packet_type *pt)
     
  41 {
  42         static struct packet_type psnap_packet_type = 
  43         {
  44                 0,      
  45                 NULL,           
  46                 snap_rcv,
  47                 NULL,
  48                 NULL,
  49         };
  50         
  51         struct datalink_proto   *proto;
  52 
  53         proto = find_snap_client(skb->h.raw);
  54         if (proto != NULL) 
  55         {
  56                 
  57 
  58 
  59                  
  60                 skb->h.raw += 5;
  61                 skb_pull(skb,5);
  62                 if (psnap_packet_type.type == 0)
  63                         psnap_packet_type.type=htons(ETH_P_SNAP);
  64                 return proto->rcvfunc(skb, dev, &psnap_packet_type);
  65         }
  66         skb->sk = NULL;
  67         kfree_skb(skb, FREE_READ);
  68         return 0;
  69 }
  70 
  71 
  72 
  73 
  74  
  75 static void snap_datalink_header(struct datalink_proto *dl, struct sk_buff *skb, unsigned char *dest_node)
     
  76 {
  77         memcpy(skb_push(skb,5),dl->type,5);
  78         snap_dl->datalink_header(snap_dl, skb, dest_node);
  79 }
  80 
  81 
  82 
  83 
  84  
  85 void snap_proto_init(struct net_proto *pro)
     
  86 {
  87         snap_dl=register_8022_client(0xAA, snap_rcv);
  88         if(snap_dl==NULL)
  89                 printk("SNAP - unable to register with 802.2\n");
  90 }
  91         
  92 
  93 
  94 
  95  
  96 struct datalink_proto *register_snap_client(unsigned char *desc, int (*rcvfunc)(struct sk_buff *, struct device *, struct packet_type *))
     
  97 {
  98         struct datalink_proto   *proto;
  99 
 100         if (find_snap_client(desc) != NULL)
 101                 return NULL;
 102 
 103         proto = (struct datalink_proto *) kmalloc(sizeof(*proto), GFP_ATOMIC);
 104         if (proto != NULL) 
 105         {
 106                 memcpy(proto->type, desc,5);
 107                 proto->type_len = 5;
 108                 proto->rcvfunc = rcvfunc;
 109                 proto->header_length = 5+snap_dl->header_length;
 110                 proto->datalink_header = snap_datalink_header;
 111                 proto->string_name = "SNAP";
 112                 proto->next = snap_list;
 113                 snap_list = proto;
 114         }
 115 
 116         return proto;
 117 }
 118