]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
cwc: improve EMM handling for multiple readers with same CAS system 84/head
authorJaroslav Kysela <perex@perex.cz>
Tue, 10 Apr 2012 09:22:47 +0000 (11:22 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 10 Apr 2012 09:25:40 +0000 (11:25 +0200)
Add CAID filter to identify the correct reader for EMM messages. Previous
code sent all EMMs to all readers with different CAIDs but same CAS system.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/cwc.c
src/cwc.h
src/dvb/dvb_tables.c

index 431596a4ea2415112ce235bfac0d8d70d77593be..c18cb4455518f2da1598c8c860d3f7c251fa7b55 100644 (file)
--- a/src/cwc.c
+++ b/src/cwc.c
@@ -1180,14 +1180,15 @@ cwc_emm_cache_lookup(cwc_t *cwc, uint32_t crc)
  *
  */
 void
-cwc_emm(uint8_t *data, int len)
+cwc_emm(uint8_t *data, int len, uint16_t caid)
 {
   cwc_t *cwc;
 
   pthread_mutex_lock(&cwc_mutex);
 
   TAILQ_FOREACH(cwc, &cwcs, cwc_link) {
-    if(cwc->cwc_forward_emm && cwc->cwc_writer_running) {
+    if(cwc->cwc_caid == caid &&
+       cwc->cwc_forward_emm && cwc->cwc_writer_running) {
       switch (cwc->cwc_card_type) {
       case CARD_CONAX:
        cwc_emm_conax(cwc, data, len);
index fa3cede9a003c5c98bcb4c1d116aecb01f6e6c53..da2381bfdb84eeee28d68b97be0c6d81a8d0eb05 100644 (file)
--- a/src/cwc.h
+++ b/src/cwc.h
@@ -23,6 +23,6 @@ void cwc_init(void);
 
 void cwc_service_start(struct service *t);
 
-void cwc_emm(uint8_t *data, int len);
+void cwc_emm(uint8_t *data, int len, uint16_t caid);
 
 #endif /* CWC_H_ */
index 00042008fbc22eabfb2eff7c9059249f1ced9fcf..2225b6cce0544d753aa2b1e9411ccdd799b85ed5 100644 (file)
@@ -828,7 +828,7 @@ static int
 dvb_ca_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
                uint8_t tableid, void *opaque)
 {
-  cwc_emm(ptr, len);
+  cwc_emm(ptr, len, (uintptr_t)opaque);
   return 0;
 }
 
@@ -841,6 +841,7 @@ dvb_cat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
 {
   int tag, tlen;
   uint16_t pid;
+  uintptr_t caid;
 
   if((ptr[2] & 1) == 0) {
     /* current_next_indicator == next, skip this */
@@ -856,13 +857,13 @@ dvb_cat_callback(th_dvb_mux_instance_t *tdmi, uint8_t *ptr, int len,
     len -= 2;
     switch(tag) {
     case DVB_DESC_CA:
-      //      caid = ( ptr[0]         << 8) | ptr[1];
+      caid = ( ptr[0]         << 8) | ptr[1];
       pid  = ((ptr[2] & 0x1f) << 8) | ptr[3];
 
       if(pid == 0)
        break;
 
-      tdt_add(tdmi, NULL, dvb_ca_callback, NULL, "CA", 
+      tdt_add(tdmi, NULL, dvb_ca_callback, (void *)caid, "CA", 
              TDT_INC_TABLE_HDR, pid, NULL);
       break;