Hi Urs,

i tested your patch that uses the sockets inode number instead of the pointer
address to the sock structure. It works great and has indeed a new benefit
for the debugging.

Additionally i added a counter for tx drops to the bcm that was missing in my
tests for ages:

har...@vwagwolkf320:~/linux-2.6$ cat /proc/net/can-bcm/43572 
>>> socket inode 43572 / dropped 0 / dropped_tx 0 / bound vcan1 <<<

The problem of the address exposure for the callback function and its
parameter could be fixed by adding a new kernel config option - as done by
different other kernel code: CONFIG_CAN_DEBUG_NETLAYER

Unfortunately i mixed all this into one patch for this testing.
Anyway, what's your opinion about the suggested changes?

Regards,
Oliver

---

diff --git a/net/can/Kconfig b/net/can/Kconfig
index 89395b2..b57f3c4 100644
--- a/net/can/Kconfig
+++ b/net/can/Kconfig
@@ -40,5 +40,14 @@ config CAN_BCM
          CAN messages are used on the bus (e.g. in automotive environments).
          To use the Broadcast Manager, use AF_CAN with protocol CAN_BCM.
 
+config CAN_DEBUG_NETLAYER
+       bool "Enable CAN network layer debugging"
+       depends on CAN
+       default N
+       ---help---
+         Say Y here if you are developing and/or debugging protocols for the
+         CAN network layer. When enabled e.g. kernel internal addresses to
+         structures and function pointers are exposed in the procfs output
+         in /proc/net/can/rcvlist_* .
 
 source "drivers/net/can/Kconfig"
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 08ffe9e..768e79f 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -124,8 +124,8 @@ struct bcm_sock {
        struct list_head rx_ops;
        struct list_head tx_ops;
        unsigned long dropped_usr_msgs;
+       unsigned long dropped_tx_msgs;
        struct proc_dir_entry *bcm_proc_read;
-       char procname [9]; /* pointer printed in ASCII with \0 */
 };
 
 static inline struct bcm_sock *bcm_sk(const struct sock *sk)
@@ -165,10 +165,9 @@ static int bcm_proc_show(struct seq_file *m, void *v)
        struct bcm_sock *bo = bcm_sk(sk);
        struct bcm_op *op;
 
-       seq_printf(m, ">>> socket %p", sk->sk_socket);
-       seq_printf(m, " / sk %p", sk);
-       seq_printf(m, " / bo %p", bo);
+       seq_printf(m, ">>> socket inode %lu", sock_i_ino(sk));
        seq_printf(m, " / dropped %lu", bo->dropped_usr_msgs);
+       seq_printf(m, " / dropped_tx %lu", bo->dropped_tx_msgs);
        seq_printf(m, " / bound %s", bcm_proc_getifname(ifname, bo->ifindex));
        seq_printf(m, " <<<\n");
 
@@ -266,7 +265,12 @@ static void bcm_can_tx(struct bcm_op *op)
        /* send with loopback */
        skb->dev = dev;
        skb->sk = op->sk;
-       can_send(skb, 1);
+
+       if (can_send(skb, 1)) {
+               struct bcm_sock *bo = bcm_sk(op->sk);
+
+               bo->dropped_tx_msgs++;
+       }
 
        /* update statistics */
        op->currframe++;
@@ -1426,6 +1430,7 @@ static int bcm_release(struct socket *sock)
        struct sock *sk = sock->sk;
        struct bcm_sock *bo = bcm_sk(sk);
        struct bcm_op *op, *next;
+       char proc_fname[32];
 
        /* remove bcm_ops, timer, rx_unregister(), etc. */
 
@@ -1465,8 +1470,10 @@ static int bcm_release(struct socket *sock)
        }
 
        /* remove procfs entry */
-       if (proc_dir && bo->bcm_proc_read)
-               remove_proc_entry(bo->procname, proc_dir);
+       if (proc_dir && bo->bcm_proc_read) {
+               snprintf(proc_fname, sizeof(proc_fname), "%lu", sock_i_ino(sk));
+               remove_proc_entry(proc_fname, proc_dir);
+       }
 
        /* remove device reference */
        if (bo->bound) {
@@ -1489,6 +1496,7 @@ static int bcm_connect(struct socket *sock, struct 
sockaddr *uaddr, int len,
        struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
        struct sock *sk = sock->sk;
        struct bcm_sock *bo = bcm_sk(sk);
+       char proc_fname[32];
 
        if (len < sizeof(*addr))
                return -EINVAL;
@@ -1521,8 +1529,8 @@ static int bcm_connect(struct socket *sock, struct 
sockaddr *uaddr, int len,
 
        if (proc_dir) {
                /* unique socket address as filename */
-               sprintf(bo->procname, "%p", sock);
-               bo->bcm_proc_read = proc_create_data(bo->procname, 0644,
+               snprintf(proc_fname, sizeof(proc_fname), "%lu", sock_i_ino(sk));
+               bo->bcm_proc_read = proc_create_data(proc_fname, 0644,
                                                     proc_dir,
                                                     &bcm_proc_fops, sk);
        }
diff --git a/net/can/proc.c b/net/can/proc.c
index f4265cc..6011547 100644
--- a/net/can/proc.c
+++ b/net/can/proc.c
@@ -208,8 +208,12 @@ static void can_print_rcvlist(struct seq_file *m, struct 
hlist_head *rx_list,
                        "   %-5s     %03X    %08x  %08lx  %08lx  %8ld  %s\n";
 
                seq_printf(m, fmt, DNAME(dev), r->can_id, r->mask,
-                               (unsigned long)r->func, (unsigned long)r->data,
-                               r->matches, r->ident);
+#ifdef CONFIG_CAN_DEBUG_NETLAYER
+                          (unsigned long)r->func, (unsigned long)r->data,
+#else
+                          0, 0,
+#endif
+                          r->matches, r->ident);
        }
 }
 

_______________________________________________
Socketcan-core mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/socketcan-core

Reply via email to