struct net_device *rx_reg_dev;
};
-struct bcm_opt {
- int bound;
- int ifindex;
- struct notifier_block notifier;
- struct list_head rx_ops;
- struct list_head tx_ops;
- unsigned long dropped_usr_msgs;
- struct proc_dir_entry *bcm_proc_read;
- char procname [9]; /* pointer printed in ASCII with \0 */
-};
-
static struct proc_dir_entry *proc_dir = NULL;
#ifdef CONFIG_CAN_BCM_USER
#define BCM_CAP CAP_NET_RAW
#endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
struct bcm_sock {
- struct sock sk;
- struct bcm_opt opt;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ struct sock sk;
+#else
+ struct sock *sk;
+#endif
+ int bound;
+ int ifindex;
+ struct notifier_block notifier;
+ struct list_head rx_ops;
+ struct list_head tx_ops;
+ unsigned long dropped_usr_msgs;
+ struct proc_dir_entry *bcm_proc_read;
+ char procname [9]; /* pointer printed in ASCII with \0 */
};
-static inline struct bcm_opt *bcm_sk(const struct sock *sk)
+static inline struct bcm_sock *bcm_sk(const struct sock *sk)
{
- return &((struct bcm_sock *)sk)->opt;
-}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ return (struct bcm_sock *)sk;
#else
-static inline struct bcm_opt *bcm_sk(const struct sock *sk)
-{
- return (struct bcm_opt *)sk->sk_protinfo;
-}
+ return (struct bcm_sock *)sk->sk_protinfo;
#endif
+}
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
static void *kzalloc(size_t size, unsigned int __nocast flags)
{
int len = 0;
struct sock *sk = (struct sock *)data;
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
struct bcm_op *op;
len += snprintf(page + len, PAGE_SIZE - len, ">>> socket %p",
err = sock_queue_rcv_skb(sk, skb);
if (err < 0) {
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
DBG("sock_queue_rcv_skb failed: %d\n", err);
kfree_skb(skb);
static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
int ifindex, struct sock *sk)
{
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
struct bcm_op *op;
int i, err;
static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
int ifindex, struct sock *sk)
{
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
struct bcm_op *op;
int do_rx_register;
int err;
struct msghdr *msg, size_t size)
{
struct sock *sk = sock->sk;
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
int ifindex = bo->ifindex; /* default ifindex for this bcm_op */
struct bcm_msg_head msg_head;
int ret; /* read bytes or error codes as return value */
void *data)
{
struct net_device *dev = (struct net_device *)data;
- struct bcm_opt *bo = container_of(nb, struct bcm_opt, notifier);
+ struct bcm_sock *bo = container_of(nb, struct bcm_sock, notifier);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
- struct bcm_sock *bs = container_of(bo, struct bcm_sock, opt);
- struct sock *sk = &bs->sk;
+ struct sock *sk = &bo->sk;
#else
-#error TODO (if needed): Notifier support for Kernel Versions < 2.6.12
+ struct sock *sk = bo->sk;
#endif
struct bcm_op *op;
int notify_enodev = 0;
*/
static int bcm_init(struct sock *sk)
{
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
+ bo->sk = sk;
+#endif
bo->bound = 0;
bo->ifindex = 0;
bo->dropped_usr_msgs = 0;
static int bcm_release(struct socket *sock)
{
struct sock *sk = sock->sk;
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
struct bcm_op *op, *next;
DBG("socket %p, sk %p\n", sock, sk);
{
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
struct sock *sk = sock->sk;
- struct bcm_opt *bo = bcm_sk(sk);
+ struct bcm_sock *bo = bcm_sk(sk);
if (bo->bound)
return -EISCONN;
.capability = BCM_CAP,
.ops = &bcm_ops,
.owner = THIS_MODULE,
- .obj_size = sizeof(struct bcm_opt),
+ .obj_size = sizeof(struct bcm_sock),
.init = bcm_init,
};
#endif
* storing the single filter in dfilter, to avoid using dynamic memory.
*/
-struct raw_opt {
+struct raw_sock {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ struct sock sk;
+#else
+ struct sock *sk;
+#endif
int bound;
int ifindex;
struct notifier_block notifier;
can_err_mask_t err_mask;
};
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-struct raw_sock {
- struct sock sk;
- struct raw_opt opt;
-};
-
-static inline struct raw_opt *raw_sk(const struct sock *sk)
+static inline struct raw_sock *raw_sk(const struct sock *sk)
{
- return &((struct raw_sock *)sk)->opt;
-}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
+ return (struct raw_sock *)sk;
#else
-static inline struct raw_opt *raw_sk(const struct sock *sk)
-{
- return (struct raw_opt *)sk->sk_protinfo;
-}
+ return (struct raw_sock *)sk->sk_protinfo;
#endif
+}
static void raw_rcv(struct sk_buff *skb, void *data)
{
struct sock *sk = (struct sock*)data;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
struct sockaddr_can *addr;
int error;
static void raw_enable_filters(struct net_device *dev, struct sock *sk)
{
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
struct can_filter *filter = ro->filter;
int i;
static void raw_enable_errfilter(struct net_device *dev, struct sock *sk)
{
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
if (ro->err_mask)
can_rx_register(dev, 0, ro->err_mask | CAN_ERR_FLAG,
static void raw_disable_filters(struct net_device *dev, struct sock *sk)
{
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
struct can_filter *filter = ro->filter;
int i;
static void raw_disable_errfilter(struct net_device *dev, struct sock *sk)
{
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
if (ro->err_mask)
can_rx_unregister(dev, 0, ro->err_mask | CAN_ERR_FLAG,
unsigned long msg, void *data)
{
struct net_device *dev = (struct net_device *)data;
- struct raw_opt *ro = container_of(nb, struct raw_opt, notifier);
+ struct raw_sock *ro = container_of(nb, struct raw_sock, notifier);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
- struct raw_sock *rs = container_of(ro, struct raw_sock, opt);
- struct sock *sk = &rs->sk;
+ struct sock *sk = &ro->sk;
#else
-#error TODO (if needed): Notifier support for Kernel Versions < 2.6.12
+ struct sock *sk = ro->sk;
#endif
DBG("msg %ld for dev %p (%s idx %d) sk %p ro->ifindex %d\n",
static int raw_init(struct sock *sk)
{
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12)
+ ro->sk = sk;
+#endif
ro->bound = 0;
ro->ifindex = 0;
static int raw_release(struct socket *sock)
{
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
DBG("socket %p, sk %p, refcnt %d\n", sock, sk,
atomic_read(&sk->sk_refcnt));
{
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
int err = 0;
int notify_enetdown = 0;
{
struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
if (peer)
return -EOPNOTSUPP;
char __user *optval, int optlen)
{
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
struct can_filter *filter = NULL; /* dyn. alloc'ed filters */
struct can_filter sfilter; /* single filter */
struct net_device *dev = NULL;
char __user *optval, int __user *optlen)
{
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
int len;
void *val;
int err = 0;
struct msghdr *msg, size_t size)
{
struct sock *sk = sock->sk;
- struct raw_opt *ro = raw_sk(sk);
+ struct raw_sock *ro = raw_sk(sk);
struct sk_buff *skb;
struct net_device *dev;
int ifindex;
.capability = RAW_CAP,
.ops = &raw_ops,
.owner = THIS_MODULE,
- .obj_size = sizeof(struct raw_opt),
+ .obj_size = sizeof(struct raw_sock),
.init = raw_init,
};
#endif