Add a /proc/audit entry for debugging to instrument many audit subsystem
internal parameters not normally visible.

Signed-off-by: Richard Guy Briggs <r...@redhat.com>
---
 include/linux/skbuff.h |   16 ++++++++++++++++
 kernel/audit.c         |   48 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index f54d665..bcde922 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -180,6 +180,7 @@ struct sk_buff_head {
 
        __u32           qlen;
        spinlock_t      lock;
+       __u32           qlen_max;
 };
 
 struct sk_buff;
@@ -1301,6 +1302,11 @@ static inline __u32 skb_queue_len(const struct 
sk_buff_head *list_)
        return list_->qlen;
 }
 
+static inline __u32 skb_queue_len_max(const struct sk_buff_head *list_)
+{
+       return list_->qlen_max;
+}
+
 /**
  *     __skb_queue_head_init - initialize non-spinlock portions of sk_buff_head
  *     @list: queue to initialize
@@ -1354,6 +1360,8 @@ static inline void __skb_insert(struct sk_buff *newsk,
        newsk->prev = prev;
        next->prev  = prev->next = newsk;
        list->qlen++;
+       if(list->qlen > list->qlen_max)
+               list->qlen_max = list->qlen;
 }
 
 static inline void __skb_queue_splice(const struct sk_buff_head *list,
@@ -1381,6 +1389,8 @@ static inline void skb_queue_splice(const struct 
sk_buff_head *list,
        if (!skb_queue_empty(list)) {
                __skb_queue_splice(list, (struct sk_buff *) head, head->next);
                head->qlen += list->qlen;
+               if(head->qlen > head->qlen_max)
+                       head->qlen_max = head->qlen;
        }
 }
 
@@ -1397,6 +1407,8 @@ static inline void skb_queue_splice_init(struct 
sk_buff_head *list,
        if (!skb_queue_empty(list)) {
                __skb_queue_splice(list, (struct sk_buff *) head, head->next);
                head->qlen += list->qlen;
+               if(head->qlen > head->qlen_max)
+                       head->qlen_max = head->qlen;
                __skb_queue_head_init(list);
        }
 }
@@ -1412,6 +1424,8 @@ static inline void skb_queue_splice_tail(const struct 
sk_buff_head *list,
        if (!skb_queue_empty(list)) {
                __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
                head->qlen += list->qlen;
+               if(head->qlen > head->qlen_max)
+                       head->qlen_max = head->qlen;
        }
 }
 
@@ -1429,6 +1443,8 @@ static inline void skb_queue_splice_tail_init(struct 
sk_buff_head *list,
        if (!skb_queue_empty(list)) {
                __skb_queue_splice(list, head->prev, (struct sk_buff *) head);
                head->qlen += list->qlen;
+               if(head->qlen > head->qlen_max)
+                       head->qlen_max = head->qlen;
                __skb_queue_head_init(list);
        }
 }
diff --git a/kernel/audit.c b/kernel/audit.c
index d4e19fc..82df9fd 100644
--- a/kernel/audit.c
+++ b/kernel/audit.c
@@ -124,6 +124,7 @@ u32         audit_sig_sid = 0;
    4) suppressed due to audit_backlog_limit
 */
 static atomic_t    audit_lost = ATOMIC_INIT(0);
+static atomic_t    audit_hold_lost = ATOMIC_INIT(0);
 
 /* The netlink socket. */
 static struct sock *audit_sock;
@@ -381,7 +382,10 @@ static void audit_hold_skb(struct sk_buff *skb)
             skb_queue_len(&audit_skb_hold_queue) < audit_backlog_limit))
                skb_queue_tail(&audit_skb_hold_queue, skb);
        else
+       {
                kfree_skb(skb);
+               atomic_inc(&audit_hold_lost);
+       }
 }
 
 /*
@@ -510,7 +514,10 @@ static void flush_hold_queue(void)
         * dequeued an skb we need to drop ref
         */
        if (skb)
+       {
                consume_skb(skb);
+               atomic_inc(&audit_hold_lost);
+       }
 }
 
 static int kauditd_thread(void *dummy)
@@ -1174,6 +1181,45 @@ static struct pernet_operations audit_net_ops 
__net_initdata = {
        .size = sizeof(struct audit_net),
 };
 
+/* Display information about audit subsystem */
+static int proc_auditstats_show(struct seq_file *m, void *v)
+{
+       //seq_printf(m, "audit_initialized\t%d\n", audit_initialized);
+       //seq_printf(m, "audit_enabled\t%u\n", audit_enabled);
+       //seq_printf(m, "audit_ever_enabled\t%u\n", audit_ever_enabled);
+       //seq_printf(m, "audit_default\t%u\n", audit_default);
+       //seq_printf(m, "audit_failure\t%u\n", audit_failure);
+       seq_printf(m, "audit_pid\t\t\t%d\n", audit_pid);
+       //seq_printf(m, "audit_nlk_portid\t%u\n", audit_nlk_portid);
+       //seq_printf(m, "audit_rate_limit\t%u\n", audit_rate_limit);
+       //seq_printf(m, "audit_backlog_limit\t%u\n", audit_backlog_limit);
+       //seq_printf(m, "audit_backlog_wait_time\t%u\n", 
audit_backlog_wait_time);
+       //seq_printf(m, "audit_sig_uid\t%u\n", from_kuid(&init_user_ns, 
audit_sig_uid));
+       //seq_printf(m, "audit_sig_pid\t%d\n", audit_sig_pid);
+       //seq_printf(m, "audit_sig_sid\t%u\n", audit_sig_sid);
+       seq_printf(m, "audit_lost\t\t\t%d\n", atomic_read(&audit_lost));
+       seq_printf(m, "audit_hold_lost\t\t\t%d\n", 
atomic_read(&audit_hold_lost));
+       seq_printf(m, "audit_freelist_count\t\t%u\n", audit_freelist_count);
+       seq_printf(m, "audit_skb_queue len\t\t%d\n", 
skb_queue_len(&audit_skb_queue));
+       seq_printf(m, "audit_skb_queue len_max\t\t%d\n", 
skb_queue_len_max(&audit_skb_queue));
+       seq_printf(m, "audit_skb_hold_queue len\t%d\n", 
skb_queue_len(&audit_skb_hold_queue));
+       seq_printf(m, "audit_skb_hold_queue len_max\t%d\n", 
skb_queue_len_max(&audit_skb_hold_queue));
+
+       return 0;
+}
+
+static int auditstats_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, proc_auditstats_show, NULL);
+}
+
+static const struct file_operations proc_auditstats_operations = {
+       .open = auditstats_open,
+       .read = seq_read,
+       .llseek = seq_lseek,
+       .release = single_release,
+};
+
 /* Initialize audit support at boot time. */
 static int __init audit_init(void)
 {
@@ -1197,6 +1243,8 @@ static int __init audit_init(void)
        for (i = 0; i < AUDIT_INODE_BUCKETS; i++)
                INIT_LIST_HEAD(&audit_inode_hash[i]);
 
+       proc_create("audit", 0, NULL, &proc_auditstats_operations);
+
        return 0;
 }
 __initcall(audit_init);
-- 
1.7.1

--
Linux-audit mailing list
Linux-audit@redhat.com
https://www.redhat.com/mailman/listinfo/linux-audit

Reply via email to