Browse Source

Raise errors flags for ecm/emm processing only after couple of bad events.

This prevents unnececary warnings. Sometimes OSCAM responds with error
and on the next query everything is OK. So before raising errors flags
try a couple of times.
Georgi Chorbadzhiyski 12 years ago
parent
commit
50762790b8
2 changed files with 27 additions and 5 deletions
  1. 18
    5
      camd.c
  2. 9
    0
      data.h

+ 18
- 5
camd.c View File

@@ -139,8 +139,11 @@ READ:
139 139
 			data[0],
140 140
 			data[0] == 0x08 ? "No card" :
141 141
 			data[0] == 0x44 ? "No code word found" : "Unknown");
142
-		c->key->is_valid_cw = 0;
143
-		memcpy(c->key->cw, invalid_cw, 16);
142
+		c->ecm_recv_errors++;
143
+		if (c->ecm_recv_errors >= ECM_RECV_ERRORS_LIMIT) {
144
+			c->key->is_valid_cw = 0;
145
+			memcpy(c->key->cw, invalid_cw, 16);
146
+		}
144 147
 		return 0;
145 148
 	}
146 149
 
@@ -173,6 +176,8 @@ READ:
173 176
 	// At first ts_keyset is not initialized
174 177
 	last_ts_keyset = c->key->ts_keyset;
175 178
 	if (c->key->is_valid_cw) {
179
+		c->ecm_recv_errors = 0;
180
+
176 181
 		gettimeofday(&c->key->ts_keyset, NULL);
177 182
 		c->key->ts = c->key->ts_keyset.tv_sec;
178 183
 		ts->cw_last_warn = c->key->ts;
@@ -287,9 +292,17 @@ static int camd35_send_emm(struct ts *ts, uint16_t ca_id, uint8_t *data, uint8_t
287 292
 		usleep(ts->packet_delay);
288 293
 
289 294
 	int ret = camd35_send_buf(ts, to_send);
290
-	if (ret <= 0) {
291
-		ts_LOGf("ERR | Error sending emm packet, reconnecting to camd.\n");
292
-		camd35_reconnect(ts);
295
+	if (ret < 0) {
296
+		c->emm_recv_errors++;
297
+		if (c->emm_recv_errors >= EMM_RECV_ERRORS_LIMIT) {
298
+			ts_LOGf("ERR | Error sending emm packet, reconnecting to camd.\n");
299
+			camd35_reconnect(ts);
300
+			c->emm_recv_errors = 0;
301
+		} else {
302
+			ts_LOGf("ERR | Error sending emm packet (nerrors: %d).\n", c->emm_recv_errors);
303
+		}
304
+	} else {
305
+			c->emm_recv_errors = 0;
293 306
 	}
294 307
 	return ret;
295 308
 }

+ 9
- 0
data.h View File

@@ -55,6 +55,12 @@ struct key {
55 55
 #define CAMD35_HDR_LEN (20)
56 56
 #define CAMD35_BUF_LEN (4 + CAMD35_HDR_LEN + 256 + 16)
57 57
 
58
+// When this limit is reached invalid_cw flag is set.
59
+#define ECM_RECV_ERRORS_LIMIT 10
60
+
61
+// When this limit is reached camd_reconnect is called.
62
+#define EMM_RECV_ERRORS_LIMIT 10
63
+
58 64
 struct camd35 {
59 65
 	uint8_t			buf[CAMD35_BUF_LEN];
60 66
 
@@ -66,6 +72,9 @@ struct camd35 {
66 72
 	AES_KEY			aes_encrypt_key;
67 73
 	AES_KEY			aes_decrypt_key;
68 74
 
75
+	unsigned int	ecm_recv_errors; // Error counter, reset on successful send/recv
76
+	unsigned int	emm_recv_errors; // Error counter, reset on successful send/recv
77
+
69 78
 	uint32_t		auth_token;
70 79
 
71 80
 	struct key		*key;

Loading…
Cancel
Save