linux/net/atm/raw.c
<<
>>
Prefs
   1/* net/atm/raw.c - Raw AAL0 and AAL5 transports */
   2
   3/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
   4
   5
   6#include <linux/module.h>
   7#include <linux/atmdev.h>
   8#include <linux/capability.h>
   9#include <linux/kernel.h>
  10#include <linux/skbuff.h>
  11#include <linux/mm.h>
  12
  13#include "common.h"
  14#include "protocols.h"
  15
  16/*
  17 * SKB == NULL indicates that the link is being closed
  18 */
  19
  20static void atm_push_raw(struct atm_vcc *vcc,struct sk_buff *skb)
  21{
  22        if (skb) {
  23                struct sock *sk = sk_atm(vcc);
  24
  25                skb_queue_tail(&sk->sk_receive_queue, skb);
  26                sk->sk_data_ready(sk, skb->len);
  27        }
  28}
  29
  30
  31static void atm_pop_raw(struct atm_vcc *vcc,struct sk_buff *skb)
  32{
  33        struct sock *sk = sk_atm(vcc);
  34
  35        pr_debug("APopR (%d) %d -= %d\n", vcc->vci,
  36                sk_wmem_alloc_get(sk), skb->truesize);
  37        atomic_sub(skb->truesize, &sk->sk_wmem_alloc);
  38        dev_kfree_skb_any(skb);
  39        sk->sk_write_space(sk);
  40}
  41
  42
  43static int atm_send_aal0(struct atm_vcc *vcc,struct sk_buff *skb)
  44{
  45        /*
  46         * Note that if vpi/vci are _ANY or _UNSPEC the below will
  47         * still work
  48         */
  49        if (!capable(CAP_NET_ADMIN) &&
  50            (((u32 *) skb->data)[0] & (ATM_HDR_VPI_MASK | ATM_HDR_VCI_MASK)) !=
  51            ((vcc->vpi << ATM_HDR_VPI_SHIFT) | (vcc->vci << ATM_HDR_VCI_SHIFT)))
  52            {
  53                kfree_skb(skb);
  54                return -EADDRNOTAVAIL;
  55        }
  56        return vcc->dev->ops->send(vcc,skb);
  57}
  58
  59
  60int atm_init_aal0(struct atm_vcc *vcc)
  61{
  62        vcc->push = atm_push_raw;
  63        vcc->pop = atm_pop_raw;
  64        vcc->push_oam = NULL;
  65        vcc->send = atm_send_aal0;
  66        return 0;
  67}
  68
  69
  70int atm_init_aal34(struct atm_vcc *vcc)
  71{
  72        vcc->push = atm_push_raw;
  73        vcc->pop = atm_pop_raw;
  74        vcc->push_oam = NULL;
  75        vcc->send = vcc->dev->ops->send;
  76        return 0;
  77}
  78
  79
  80int atm_init_aal5(struct atm_vcc *vcc)
  81{
  82        vcc->push = atm_push_raw;
  83        vcc->pop = atm_pop_raw;
  84        vcc->push_oam = NULL;
  85        vcc->send = vcc->dev->ops->send;
  86        return 0;
  87}
  88
  89
  90EXPORT_SYMBOL(atm_init_aal5);
  91