mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
uip: rate-limit the dropped-fragment log
uip has no reassembly, so every fragment it receives is discarded and logged. A neighbour that broadcasts fragmented traffic therefore produces a continuous stream of "ip: fragment dropped." rather than an occasional one, at roughly thirteen lines a second on a quiet segment, which buries every other console message. The message carries real information: a sudden burst of it says something about the network. What carries none is repeating it per fragment. Report the count once per five second window instead, which keeps the signal and ends the flood. The count is printed through the no_syslog primitives, as the original message was, so the flood cannot move from the console into the log ring. itoa() writes through write_char(), which also feeds the ring, so it gets a no_syslog twin beside it rather than a private copy of its digits.
This commit is contained in:
1 parent
88454ec7d7
commit
d0374541c5
4 files changed
+35
-1
No files matched your search
@@ -98,6 +98,7 @@
|
||||
#include "../rtl837x_regs.h"
|
||||
|
||||
extern __xdata uint8_t rx_headers[16];
|
||||
extern volatile __xdata uint32_t ticks;
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Variable definitions. */
|
||||
@@ -243,6 +244,9 @@ __xdata struct uip_stats uip_stat;
|
||||
|
||||
#if UIP_LOGGING == 1
|
||||
#define UIP_LOG(m) print_string_newline_no_syslog(m);
|
||||
#define FRAGDROP_WINDOW (5 * SYS_TICK_HZ)
|
||||
static __xdata u16_t fragdrop_mark;
|
||||
static __xdata u8_t fragdrop_count;
|
||||
#else
|
||||
#define UIP_LOG(m)
|
||||
#endif /* UIP_LOGGING == 1 */
|
||||
@@ -710,6 +714,17 @@ uip_process(u8_t flag) __banked
|
||||
/* Check if we were invoked because of the perodic timer fireing. */
|
||||
} else if(flag == UIP_TIMER) {
|
||||
// print_string("T1\n");
|
||||
#if UIP_LOGGING == 1
|
||||
if(fragdrop_count && (u16_t)ticks - fragdrop_mark >= FRAGDROP_WINDOW) {
|
||||
print_string_no_syslog("ip: fragments dropped: ");
|
||||
itoa_no_syslog(fragdrop_count);
|
||||
if(fragdrop_count == 0xff)
|
||||
write_char_no_syslog('+');
|
||||
write_char_no_syslog('\n');
|
||||
fragdrop_mark = (u16_t)ticks;
|
||||
fragdrop_count = 0;
|
||||
}
|
||||
#endif /* UIP_LOGGING == 1 */
|
||||
#if UIP_IDLE_TIMEOUT
|
||||
if(uip_connr == uip_conns) {
|
||||
uip_idle_age = 0;
|
||||
@@ -915,7 +930,10 @@ uip_process(u8_t flag) __banked
|
||||
#else /* UIP_REASSEMBLY */
|
||||
UIP_STAT(++uip_stat.ip.drop);
|
||||
UIP_STAT(++uip_stat.ip.fragerr);
|
||||
UIP_LOG("ip: fragment dropped.");
|
||||
#if UIP_LOGGING == 1
|
||||
if(fragdrop_count != 0xff)
|
||||
++fragdrop_count;
|
||||
#endif /* UIP_LOGGING == 1 */
|
||||
goto drop;
|
||||
#endif /* UIP_REASSEMBLY */
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user