]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
cwc: Allow updating of EMMs only from one channel at a time
authorJaroslav Kysela <perex@perex.cz>
Tue, 10 Apr 2012 18:51:10 +0000 (20:51 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 10 Apr 2012 18:57:35 +0000 (20:57 +0200)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
docs/html/config_cwc.html
src/cwc.c
src/webui/static/app/cwceditor.js

index 3877d541fdde62e5ee79541accc0cc374cd97447..24a5a251b5594e741c2566fec0019a4dc70cd98d 100644 (file)
@@ -51,6 +51,9 @@
   <dt>Update Card
   <dd>Forward Entitlement Management Messages (EMMs) to the server.
 
+  <dt>Update One
+  <dd>Forward EMMs only from one channel at a time.
+
   <dt>Comment
   <dd>Allows the administrator to set a comment only visible in this editor.
       It does not serve any active purpose.
index e2442ea852c20b48544c814b565ffd639de1b736..7db2309998da0a374ef120b1d2035a37886c6e2f 100644 (file)
--- a/src/cwc.c
+++ b/src/cwc.c
@@ -247,6 +247,10 @@ typedef struct cwc {
   } cwc_viaccess_emm;
 #define cwc_cryptoworks_emm cwc_viaccess_emm
 
+  /* one update id */
+  int64_t cwc_update_time;
+  void *cwc_update_id;
+
   /* Card type */
   card_type_t cwc_card_type;
   
@@ -261,6 +265,7 @@ typedef struct cwc {
   int cwc_port;
   char *cwc_id;
   int cwc_emm;
+  int cwc_emmex;
 
   const char *cwc_errtxt;
 
@@ -280,10 +285,10 @@ void cwc_emm_conax(cwc_t *cwc, uint8_t *data, int len);
 void cwc_emm_irdeto(cwc_t *cwc, uint8_t *data, int len);
 void cwc_emm_dre(cwc_t *cwc, uint8_t *data, int len);
 void cwc_emm_seca(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
+void cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int len);
 void cwc_emm_nagra(cwc_t *cwc, uint8_t *data, int len);
 void cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len);
-void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id);
+void cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len);
 
 
 /**
@@ -1198,6 +1203,15 @@ cwc_emm(uint8_t *data, int len, uint16_t caid, void *ca_update_id)
   TAILQ_FOREACH(cwc, &cwcs, cwc_link) {
     if(cwc->cwc_caid == caid &&
        cwc->cwc_forward_emm && cwc->cwc_writer_running) {
+      if (cwc->cwc_emmex) {
+        if (cwc->cwc_update_id != ca_update_id) {
+          int64_t delta = getmonoclock() - cwc->cwc_update_time;
+          if (delta < 25000000UL)              /* 25 seconds */
+            continue;
+        }
+        cwc->cwc_update_time = getmonoclock();
+      }
+      cwc->cwc_update_id = ca_update_id;
       switch (cwc->cwc_card_type) {
       case CARD_CONAX:
        cwc_emm_conax(cwc, data, len);
@@ -1209,7 +1223,7 @@ cwc_emm(uint8_t *data, int len, uint16_t caid, void *ca_update_id)
        cwc_emm_seca(cwc, data, len);
        break;
       case CARD_VIACCESS:
-       cwc_emm_viaccess(cwc, data, len, ca_update_id);
+       cwc_emm_viaccess(cwc, data, len);
        break;
       case CARD_DRE:
        cwc_emm_dre(cwc, data, len);
@@ -1221,7 +1235,7 @@ cwc_emm(uint8_t *data, int len, uint16_t caid, void *ca_update_id)
        cwc_emm_nds(cwc, data, len);
        break;
       case CARD_CRYPTOWORKS:
-       cwc_emm_cryptoworks(cwc, data, len, ca_update_id);
+       cwc_emm_cryptoworks(cwc, data, len);
        break;
       case CARD_UNKNOWN:
        break;
@@ -1383,7 +1397,7 @@ static int via_provider_id(uint8_t * data)
 
 
 void
-cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen, void *ca_update_id)
+cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen)
 {
   /* Get SCT len */
   int len = 3 + ((data[1] & 0x0f) << 8) + data[2];
@@ -1415,7 +1429,7 @@ cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen, void *ca_update_id)
          if (cwc->cwc_viaccess_emm.shared_emm) {
            cwc->cwc_viaccess_emm.shared_len = len;
            memcpy(cwc->cwc_viaccess_emm.shared_emm, data, len);
-           cwc->cwc_viaccess_emm.ca_update_id = ca_update_id;
+           cwc->cwc_viaccess_emm.ca_update_id = cwc->cwc_update_id;
          }
          cwc->cwc_viaccess_emm.shared_toggle = data[0];
        }
@@ -1423,7 +1437,7 @@ cwc_emm_viaccess(cwc_t *cwc, uint8_t *data, int mlen, void *ca_update_id)
       break;
     case 0x8e:
       if (cwc->cwc_viaccess_emm.shared_emm &&
-          cwc->cwc_viaccess_emm.ca_update_id == ca_update_id) {
+          cwc->cwc_viaccess_emm.ca_update_id == cwc->cwc_update_id) {
        int match = 0;
        int i;
        /* Match SA and provider in shared */
@@ -1670,7 +1684,7 @@ cwc_emm_nds(cwc_t *cwc, uint8_t *data, int len)
 }
 
 void
-cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id)
+cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len)
 {
   int match = 0;
 
@@ -1689,13 +1703,13 @@ cwc_emm_cryptoworks(cwc_t *cwc, uint8_t *data, int len, void *ca_update_id)
       if (cwc->cwc_cryptoworks_emm.shared_emm) {
         cwc->cwc_cryptoworks_emm.shared_len = len;
         memcpy(cwc->cwc_cryptoworks_emm.shared_emm, data, len);
-        cwc->cwc_cryptoworks_emm.ca_update_id = ca_update_id;
+        cwc->cwc_cryptoworks_emm.ca_update_id = cwc->cwc_update_id;
       }
     }
     break;
   case 0x86: /* emm-sb */ 
     if (cwc->cwc_cryptoworks_emm.shared_emm &&
-        cwc->cwc_cryptoworks_emm.ca_update_id == ca_update_id) {
+        cwc->cwc_cryptoworks_emm.ca_update_id == cwc->cwc_update_id) {
       /* python: EMM_SH[0:12] + EMM_SB[5:-1] + EMM_SH[12:-1] */
       uint32_t elen = len - 5 + cwc->cwc_cryptoworks_emm.shared_len - 12;
       uint8_t *tmp = malloc(elen);
@@ -1998,6 +2012,7 @@ cwc_record_build(cwc_t *cwc)
   
   htsmsg_add_str(e, "deskey", buf);
   htsmsg_add_u32(e, "emm", cwc->cwc_emm);
+  htsmsg_add_u32(e, "emmex", cwc->cwc_emmex);
   htsmsg_add_str(e, "comment", cwc->cwc_comment ?: "");
 
   return e;
@@ -2084,6 +2099,9 @@ cwc_entry_update(void *opaque, const char *id, htsmsg_t *values, int maycreate)
   if(!htsmsg_get_u32(values, "emm", &u32))
     cwc->cwc_emm = u32;
 
+  if(!htsmsg_get_u32(values, "emmex", &u32))
+    cwc->cwc_emmex = u32;
+
   cwc->cwc_reconfigure = 1;
 
   if(cwc->cwc_fd != -1)
index 99daadf12ec8a04a1a1b435e68c9570d1f6eafc3..ac5f610a80547dd632aa1bc166e659de8d940086 100644 (file)
@@ -14,6 +14,12 @@ tvheadend.cwceditor = function() {
        width: 100
     });
 
+    var emmexColumn = new Ext.grid.CheckColumn({
+       header: "Update One",
+       dataIndex: 'emmex',
+       width: 100
+    });
+
     function setMetaAttr(meta, record){
         var enabled = record.get('enabled');
         if(!enabled) return;
@@ -72,6 +78,7 @@ tvheadend.cwceditor = function() {
            editor: new fm.TextField({allowBlank: false})
        },
        emmColumn,
+       emmexColumn,
        {
            header: "Comment",
            dataIndex: 'comment',
@@ -86,7 +93,7 @@ tvheadend.cwceditor = function() {
 
     var rec = Ext.data.Record.create([
        'enabled', 'connected', 'hostname', 'port', 'username',
-       'password', 'deskey', 'emm', 'comment'
+       'password', 'deskey', 'emm', 'emmex', 'comment'
     ]);
 
     var store = new Ext.data.JsonStore({
@@ -99,7 +106,7 @@ tvheadend.cwceditor = function() {
     });
 
     var grid = new tvheadend.tableEditor('Code Word Client', 'cwc', cm, rec,
-       [enabledColumn, emmColumn], store,
+       [enabledColumn, emmColumn, emmexColumn], store,
        'config_cwc.html', 'key');
     
     tvheadend.comet.on('cwcStatus', function(msg) {