
Double Check es uno de los parametros disponibles en la emuladora Oscam, tirando un poco de historia, se trata de un parametro que sus desarrolladores añadieron junto con opciones loadBalancer hace aproximadamente 13 años.
- Source publico de oscam: https://trac.streamboard.tv/oscam/browser/trunk
- Wiki publica de oscam sobre este parametro: https://wiki.streamboard.tv/wiki/OSCam/en/Config/oscam.conf#double_check
¿ Que realiza este parametro ?
Revisando el codigo opensource antes mencionado asi como documentacion existente en la wiki oscam el proceso que realiza en el caso por ejemplo de tener dos reader (se puede usar con mas de dos reader, pero para la explicacion del codigo lo realizamos en el supuesto que se tuvieran dos reader) es el siguiente:
1. La ecm que proviene del canal de un transponedor de satelite de los que tenemos abono legal para su uso, es enviada a los dos reader que tienen una tarjeta insertada del mismo proveedor.
2. El reader mas rapido resuelve esa ecm dando la CW pero la misma no es enviada al dvbapi.
3. El reader mas lento resuelve esa misma ecm dando la CW pero la misma no es enviada al dvbapi.
4. Se realiza una comparacion entre de la CW resuelta por ambos reader.
5. Si la CW que han resuelto ambos reader es igual se envia la dvbapi (enviandose la correspondiente al lector mas lento). En el caso de que ambas CW no sean iguales, no se envia ninguna CW, pasandose a la siguiente ecm recibida repitiendose el proceso.
Si las cw no coinciden no se envia nada produciendose un timeouts (tiempo de espera), este timeouts se configura en el oscam.conf.
Ejemplo de activacion de este parametro, en este caso desde Webif de oscam:
a) En la opcion configuracion:
1. En client Timeout: se inserta el tiempo de espera deseado para cuando las dos cw no coincidan.
2. Se marca la opcion ECM doublechek
b) en opcion configuracion loadbalancer en la opcion Number of best readers se introduce el numero de reader que se dispongan, en este caso 2:
Segun el codigo opensource de esta opcion en el log solo es visual en este log la CW del primer reader resuelta.
Se pudiera realizar un cambio estetico de este log por ejemplo realizando esta modificacion:
- Editamos el archivo oscam-ecm.c
- Buscamos:
if(cfg.double_check && er->rc <= E_CACHE2 && er->selected_reader && is_double_check_caid(er, &cfg.double_check_caid))
{
if(er->checked == 0) // First CW, save it and wait for next one
{
er->checked = 1;
er->origin_reader = er->selected_reader;
memcpy(er->cw_checked, er->cw, sizeof(er->cw));
cs_log("DOUBLE CHECK FIRST CW by %s idx %d cpti %d", er->origin_reader->label, er->idx, er->msgid);
}
else if(er->origin_reader != er->selected_reader) // Second (or third and so on) cw. We have to compare
{
if(memcmp(er->cw_checked, er->cw, sizeof(er->cw)) == 0)
{
er->checked++;
cs_log("DOUBLE CHECKED! %d. CW by %s idx %d cpti %d", er->checked, er->selected_reader->label, er->idx, er->msgid);
}
else
{
cs_log("DOUBLE CHECKED NONMATCHING! %d. CW by %s idx %d cpti %d", er->checked, er->selected_reader->label, er->idx, er->msgid);
}
}
- Sustituimos por:
if(cfg.double_check && er->rc <= E_CACHE2 && er->selected_reader && is_double_check_caid(er, &cfg.double_check_caid))
{
if(er->checked == 0) // First CW, save it and wait for next one
{
char buf[ECM_FMT_LEN];
char ecmd5[17 * 3];
char cwstr[17 * 3];
format_ecm(er, buf, ECM_FMT_LEN);
cs_hexdump(0, er->ecmd5, 16, ecmd5, sizeof(ecmd5));
cs_hexdump(0, er->cw, 16, cwstr, sizeof(cwstr));
er->checked = 1;
er->origin_reader = er->selected_reader;
memcpy(er->cw_checked, er->cw, sizeof(er->cw));
cs_log("PRIMERA CW ENCONTRADA by %s cw %s ecm hash %s idx %d cpti %d", er->origin_reader->label, cwstr, ecmd5, er->idx, er->msgid);
}
else if(er->origin_reader != er->selected_reader) // Second (or third and so on) cw. We have to compare
{
if(memcmp(er->cw_checked, er->cw, sizeof(er->cw)) == 0)
{
char buf[ECM_FMT_LEN];
char ecmd5[17 * 3];
char cwstr[17 * 3];
format_ecm(er, buf, ECM_FMT_LEN);
cs_hexdump(0, er->ecmd5, 16, ecmd5, sizeof(ecmd5));
cs_hexdump(0, er->cw, 16, cwstr, sizeof(cwstr));
er->checked++;
cs_log("SEGUNDA CW ENCONTRADA %d. CW by %s cw %s ecm hash %s idx %d cpti %d", er->checked, er->selected_reader->label, cwstr, ecmd5, er->idx, er->msgid);
}
else
{
char buf[ECM_FMT_LEN];
char ecmd5[17 * 3];
char cwstr[17 * 3];
format_ecm(er, buf, ECM_FMT_LEN);
cs_hexdump(0, er->ecmd5, 16, ecmd5, sizeof(ecmd5));
cs_hexdump(0, er->cw, 16, cwstr, sizeof(cwstr));
cs_log("OJO ENCONTRADAS DIFERENCIAS %d. CW by %s cw %s ecm hash %s idx %d cpti %d", er->checked, er->selected_reader->label, cwstr, ecmd5, er->idx, er->msgid);
}
}
Para compilar podeis seguir este manual: