From dc608c074342ee7e76aca6c23707f5518a92a33c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20=C3=96man?= Date: Tue, 28 Aug 2007 12:29:05 +0000 Subject: [PATCH] make dvb code kick out subscribers if FEC error rate is too high --- dvb.c | 11 +++++++++++ dvb.h | 2 ++ dvb_dvr.c | 4 ++-- dvb_dvr.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/dvb.c b/dvb.c index 449f9747..e3020216 100644 --- a/dvb.c +++ b/dvb.c @@ -935,6 +935,17 @@ dvb_fec_monitor(void *aux) subscription_lock(); + if(tdmi->tdmi_fec_err_per_sec > DVB_FEC_ERROR_LIMIT) { + + if(LIST_FIRST(&tda->tda_transports) != NULL) { + syslog(LOG_ERR, "%s: on %s: Too many FEC errors (%d / s), " + "flushing subscribers\n", + tdmi->tdmi_mux->tdm_name, tda->tda_path, + tdmi->tdmi_fec_err_per_sec); + dvb_adapter_clean(tdmi->tdmi_adapter); + } + } + tdm = tdmi->tdmi_mux; LIST_REMOVE(tdmi, tdmi_mux_link); LIST_INSERT_SORTED(&tdm->tdm_instances, tdmi, tdmi_mux_link, diff --git a/dvb.h b/dvb.h index 67c9aa2f..c665f371 100644 --- a/dvb.h +++ b/dvb.h @@ -19,6 +19,8 @@ #ifndef DVB_H_ #define DVB_H_ +#define DVB_FEC_ERROR_LIMIT 20 + extern struct th_dvb_adapter_list dvb_adapters_probing; extern struct th_dvb_adapter_list dvb_adapters_running; extern struct th_dvb_mux_list dvb_muxes; diff --git a/dvb_dvr.c b/dvb_dvr.c index a9b421e1..fbcefd8f 100644 --- a/dvb_dvr.c +++ b/dvb_dvr.c @@ -103,7 +103,7 @@ dvr_fd_callback(int events, void *opaque, int fd) /* * */ -static void +void dvb_adapter_clean(th_dvb_adapter_t *tda) { th_transport_t *t; @@ -152,7 +152,7 @@ dvb_start_feed(th_transport_t *t, unsigned int weight) if(tdmi->tdmi_status != NULL) continue; /* no lock */ - if(tdmi->tdmi_fec_err_per_sec > 100) + if(tdmi->tdmi_fec_err_per_sec > DVB_FEC_ERROR_LIMIT) continue; /* too much errors to even consider */ if(tdmi->tdmi_state == TDMI_RUNNING) diff --git a/dvb_dvr.h b/dvb_dvr.h index b101de80..db1a1baa 100644 --- a/dvb_dvr.h +++ b/dvb_dvr.h @@ -25,4 +25,6 @@ int dvb_start_feed(th_transport_t *t, unsigned int weight); void dvb_stop_feed(th_transport_t *t); +void dvb_adapter_clean(th_dvb_adapter_t *tda); + #endif /* DVB_DVR_H */