Commit 8e618aad authored by Tilman Schmidt's avatar Tilman Schmidt Committed by David S. Miller

isdn/gigaset: ratelimit CAPI message dumps

Introduce a global ratelimit for CAPI message dumps to protect
against possible log flood.
Drop the ratelimit for ignored messages which is now covered by the
global one.
Signed-off-by: default avatarTilman Schmidt <tilman@imap.cc>
CC: stable <stable@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8a05ba08
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "gigaset.h" #include "gigaset.h"
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/ratelimit.h>
#include <linux/isdn/capilli.h> #include <linux/isdn/capilli.h>
#include <linux/isdn/capicmd.h> #include <linux/isdn/capicmd.h>
#include <linux/isdn/capiutil.h> #include <linux/isdn/capiutil.h>
...@@ -223,10 +224,14 @@ get_appl(struct gigaset_capi_ctr *iif, u16 appl) ...@@ -223,10 +224,14 @@ get_appl(struct gigaset_capi_ctr *iif, u16 appl)
static inline void dump_cmsg(enum debuglevel level, const char *tag, _cmsg *p) static inline void dump_cmsg(enum debuglevel level, const char *tag, _cmsg *p)
{ {
#ifdef CONFIG_GIGASET_DEBUG #ifdef CONFIG_GIGASET_DEBUG
/* dump at most 20 messages in 20 secs */
static DEFINE_RATELIMIT_STATE(msg_dump_ratelimit, 20 * HZ, 20);
_cdebbuf *cdb; _cdebbuf *cdb;
if (!(gigaset_debuglevel & level)) if (!(gigaset_debuglevel & level))
return; return;
if (!___ratelimit(&msg_dump_ratelimit, tag))
return;
cdb = capi_cmsg2str(p); cdb = capi_cmsg2str(p);
if (cdb) { if (cdb) {
...@@ -2058,12 +2063,6 @@ static void do_reset_b3_req(struct gigaset_capi_ctr *iif, ...@@ -2058,12 +2063,6 @@ static void do_reset_b3_req(struct gigaset_capi_ctr *iif,
CapiResetProcedureNotSupportedByCurrentProtocol); CapiResetProcedureNotSupportedByCurrentProtocol);
} }
/*
* dump unsupported/ignored messages at most twice per minute,
* some apps send those very frequently
*/
static unsigned long ignored_msg_dump_time;
/* /*
* unsupported CAPI message handler * unsupported CAPI message handler
*/ */
...@@ -2073,8 +2072,7 @@ static void do_unsupported(struct gigaset_capi_ctr *iif, ...@@ -2073,8 +2072,7 @@ static void do_unsupported(struct gigaset_capi_ctr *iif,
{ {
/* decode message */ /* decode message */
capi_message2cmsg(&iif->acmsg, skb->data); capi_message2cmsg(&iif->acmsg, skb->data);
if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000)) dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState); send_conf(iif, ap, skb, CapiMessageNotSupportedInCurrentState);
} }
...@@ -2085,11 +2083,9 @@ static void do_nothing(struct gigaset_capi_ctr *iif, ...@@ -2085,11 +2083,9 @@ static void do_nothing(struct gigaset_capi_ctr *iif,
struct gigaset_capi_appl *ap, struct gigaset_capi_appl *ap,
struct sk_buff *skb) struct sk_buff *skb)
{ {
if (printk_timed_ratelimit(&ignored_msg_dump_time, 30 * 1000)) { /* decode message */
/* decode message */ capi_message2cmsg(&iif->acmsg, skb->data);
capi_message2cmsg(&iif->acmsg, skb->data); dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
dump_cmsg(DEBUG_CMD, __func__, &iif->acmsg);
}
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment