2005-04-17 02:20:36 +04:00
/* net/atm/raw.c - Raw AAL0 and AAL5 transports */
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
# include <linux/module.h>
# include <linux/atmdev.h>
2006-01-11 23:17:47 +03:00
# include <linux/capability.h>
2005-04-17 02:20:36 +04:00
# include <linux/kernel.h>
# include <linux/skbuff.h>
# include <linux/mm.h>
# include "common.h"
# include "protocols.h"
#if 0
# define DPRINTK(format,args...) printk(KERN_DEBUG format,##args)
# else
# define DPRINTK(format,args...)
# endif
/*
* SKB = = NULL indicates that the link is being closed
*/
static void atm_push_raw ( struct atm_vcc * vcc , struct sk_buff * skb )
{
if ( skb ) {
struct sock * sk = sk_atm ( vcc ) ;
skb_queue_tail ( & sk - > sk_receive_queue , skb ) ;
sk - > sk_data_ready ( sk , skb - > len ) ;
}
}
static void atm_pop_raw ( struct atm_vcc * vcc , struct sk_buff * skb )
{
struct sock * sk = sk_atm ( vcc ) ;
DPRINTK ( " APopR (%d) %d -= %d \n " , vcc - > vci , sk - > sk_wmem_alloc ,
skb - > truesize ) ;
atomic_sub ( skb - > truesize , & sk - > sk_wmem_alloc ) ;
dev_kfree_skb_any ( skb ) ;
sk - > sk_write_space ( sk ) ;
}
static int atm_send_aal0 ( struct atm_vcc * vcc , struct sk_buff * skb )
{
/*
* Note that if vpi / vci are _ANY or _UNSPEC the below will
* still work
*/
if ( ! capable ( CAP_NET_ADMIN ) & &
2007-02-09 17:24:29 +03:00
( ( ( u32 * ) skb - > data ) [ 0 ] & ( ATM_HDR_VPI_MASK | ATM_HDR_VCI_MASK ) ) ! =
( ( vcc - > vpi < < ATM_HDR_VPI_SHIFT ) | ( vcc - > vci < < ATM_HDR_VCI_SHIFT ) ) )
2005-04-17 02:20:36 +04:00
{
kfree_skb ( skb ) ;
return - EADDRNOTAVAIL ;
2007-02-09 17:24:29 +03:00
}
2005-04-17 02:20:36 +04:00
return vcc - > dev - > ops - > send ( vcc , skb ) ;
}
int atm_init_aal0 ( struct atm_vcc * vcc )
{
vcc - > push = atm_push_raw ;
vcc - > pop = atm_pop_raw ;
vcc - > push_oam = NULL ;
vcc - > send = atm_send_aal0 ;
return 0 ;
}
int atm_init_aal34 ( struct atm_vcc * vcc )
{
vcc - > push = atm_push_raw ;
vcc - > pop = atm_pop_raw ;
vcc - > push_oam = NULL ;
vcc - > send = vcc - > dev - > ops - > send ;
return 0 ;
}
int atm_init_aal5 ( struct atm_vcc * vcc )
{
vcc - > push = atm_push_raw ;
vcc - > pop = atm_pop_raw ;
vcc - > push_oam = NULL ;
vcc - > send = vcc - > dev - > ops - > send ;
return 0 ;
}
EXPORT_SYMBOL ( atm_init_aal5 ) ;