From 954f81083ea3b9ee0352187b346bff5fb718d6da Mon Sep 17 00:00:00 2001 From: felixka Date: Wed, 19 Feb 2020 19:40:51 +0000 Subject: [PATCH] [gbx] - try fix ecm and cw messages - fix ecmfmt g,j parameters [dvbapi] - add ecm.info gbox style git-svn-id: http://www.streamboard.tv/svn/oscam/trunk@11573 4b0bc96b-bc66-0410-9d44-ebda105a78c1 --- globals.h | 6 +- module-dvbapi.c | 45 +++++++- module-gbox-cards.c | 25 ++++- module-gbox-cards.h | 1 + module-gbox.c | 155 +++++++++++++++------------ oscam-ecm.c | 9 +- webif/config/dvbapi.html | 1 + webif/readerconfig/readerconfig_gboxbit.html | 2 +- webif/readerconfig/readerinfo_gbox_remm.html | 2 +- 9 files changed, 162 insertions(+), 84 deletions(-) diff --git a/globals.h b/globals.h index 5dca7faf..2fff1dcc 100644 --- a/globals.h +++ b/globals.h @@ -1051,7 +1051,9 @@ typedef struct ecm_request_t #if defined MODULE_GBOX uint32_t gbox_crc; // rcrc for gbox, used to identify ECM task in peer responses - uint16_t gbox_ecm_id; + uint16_t gbox_cw_src_peer; + uint16_t gbox_ecm_src_peer; + uint8_t gbox_ecm_dist; uint8_t gbox_ecm_status; LLIST *gbox_cards_pending; // type gbox_card_pending #endif @@ -1774,6 +1776,8 @@ struct s_reader // contains device info, reader info and card info uint16_t gbox_remm_peer; uint16_t gbox_gsms_peer; uint8_t gbox_force_remm; + uint16_t gbox_cw_src_peer; + uint8_t gbox_crd_slot_lev; #endif #ifdef MODULE_PANDORA diff --git a/module-dvbapi.c b/module-dvbapi.c index 20a27a54..086c1c0b 100644 --- a/module-dvbapi.c +++ b/module-dvbapi.c @@ -25,7 +25,6 @@ #include "oscam-work.h" #include "reader-irdeto.h" #include "cscrypt/md5.h" - extern int32_t exit_oscam; #if defined (__CYGWIN__) @@ -7940,12 +7939,13 @@ void dvbapi_write_ecminfo_file(struct s_client *client, ECM_REQUEST *er, uint8_t #define ECMINFO_TYPE_MGCAMD 3 #define ECMINFO_TYPE_CCCAM 4 #define ECMINFO_TYPE_CAMD3 5 +#define ECMINFO_TYPE_GBOX 6 FILE *ecmtxt = fopen(ECMINFO_FILE, "w"); if(ecmtxt != NULL && er->rc < E_NOTFOUND) { char tmp[49]; // holds 16 byte cw - (2 hex digits + 1 space) * 16 byte + string termination) - const char *reader_name = NULL, *from_name = NULL, *proto_name = NULL; + const char *reader_name = NULL, *from_name = NULL, *proto_name = NULL, *from_device= NULL ; int8_t hops = 0; int32_t from_port = 0; char system_name[64]; @@ -8000,6 +8000,14 @@ void dvbapi_write_ecminfo_file(struct s_client *client, ECM_REQUEST *er, uint8_t fprintf(ecmtxt, "CAID 0x%04X, PID 0x%04X, PROVIDER 0x%06X\n", er->caid, er->pid, (uint) er->prid); } +#ifdef MODULE_GBOX + else if(cfg.dvbapi_ecminfo_type == ECMINFO_TYPE_GBOX) + { + fprintf(ecmtxt, "===== %s ECM on CaID 0x%04X, pid 0x%04X, sid 0x%04X =====\nprov: %04X, slot: %d, level: %d, dist: %d\nprovider: %06X\n", + system_name, er->caid, er->pid, er->srvid, er->selected_reader->gbox_cw_src_peer, er->selected_reader->gbox_crd_slot_lev >> 4, + er->selected_reader->gbox_crd_slot_lev & 0xf, er->selected_reader->currenthops, (uint) er->prid); + } +#endif switch(er->rc) { @@ -8010,12 +8018,13 @@ void dvbapi_write_ecminfo_file(struct s_client *client, ECM_REQUEST *er, uint8_t if(is_network_reader(er->selected_reader)) { from_name = er->selected_reader->device; + from_port = er->selected_reader->r_port; } else { from_name = "local"; + from_device = er->selected_reader->device; } - from_port = er->selected_reader->r_port; proto_name = reader_get_type_desc(er->selected_reader, 1); hops = er->selected_reader->currenthops; } @@ -8045,6 +8054,36 @@ void dvbapi_write_ecminfo_file(struct s_client *client, ECM_REQUEST *er, uint8_t proto_name = "none"; break; } + + if(cfg.dvbapi_ecminfo_type == ECMINFO_TYPE_GBOX) + { + switch(er->rc) + { + case E_FOUND: + if(er->selected_reader) + { + if(is_network_reader(er->selected_reader)) + { + fprintf(ecmtxt, "reader: %s\nfrom: %s:%d\nprotocol: %s\n", + reader_name, from_name, from_port, proto_name); + } + else + { + fprintf(ecmtxt, "reader: %s\nfrom: %s - %s\nprotocol: %s\n", + reader_name, from_name, from_device, proto_name); + } + } + break; + + case E_CACHE1: + case E_CACHE2: + case E_CACHEEX: + fprintf(ecmtxt, "reader: %s\nfrom: %s:%d\nprotocol: %s\n", + reader_name, from_name, from_port, proto_name); + break; + } + fprintf(ecmtxt, "ecm time: %.3f\n", (float) client->cwlastresptime / 1000); + } if(cfg.dvbapi_ecminfo_type <= ECMINFO_TYPE_OSCAM_MS) { diff --git a/module-gbox-cards.c b/module-gbox-cards.c index f7cb8021..8f0e7d37 100644 --- a/module-gbox-cards.c +++ b/module-gbox-cards.c @@ -40,6 +40,26 @@ struct gbox_card *gbox_cards_iter_next(GBOX_CARDS_ITER *gci) else { return NULL; } } +uint8_t gbox_get_crd_dist_lev(uint16_t crd_id) +{ + uint8_t crd_dist = 0; + uint8_t crd_level = 0; + struct gbox_card *card; + cs_readlock(__func__, &gbox_cards_lock); + LL_ITER it = ll_iter_create(gbox_cards); + while((card = ll_iter_next(&it))) + { + if (card->type == GBOX_CARD_TYPE_GBOX && card->id.peer == crd_id) + { + crd_dist = card->dist; + crd_level = card->lvl; + break; + } + } + cs_readunlock(__func__, &gbox_cards_lock); + return ((crd_level << 4) | (crd_dist & 0xf)); +} + void gbox_write_share_cards_info(void) { uint16_t card_count_shared = 0; @@ -604,13 +624,12 @@ uint8_t gbox_get_cards_for_ecm(uint8_t *send_buf, int32_t len2, uint8_t max_card else { srvid_bad->bad_strikes = 1; - cs_log("cards.c - get card for ecm - Block bad sid - %d bad strikes", srvid_bad->bad_strikes); + //cs_log("cards.c - get card for ecm - Block bad SID: %04X - %d bad strikes", srvid_bad->srvid.sid, srvid_bad->bad_strikes); } } - else { sid_verified = 1; } - cs_log_dbg(D_READER, "ID: %04X SL: %02X SID: %04X is bad %d", card->id.peer, card->id.slot, srvid_bad->srvid.sid, srvid_bad->bad_strikes); + cs_log_dbg(D_READER, "CRD_ID: %04X Slot: %d SID: %04X failed to relpy %d times", card->id.peer, card->id.slot, srvid_bad->srvid.sid, srvid_bad->bad_strikes); break; } } diff --git a/module-gbox-cards.h b/module-gbox-cards.h index 08eb2444..bac90a69 100644 --- a/module-gbox-cards.h +++ b/module-gbox-cards.h @@ -25,6 +25,7 @@ void gbox_add_good_sid(uint16_t id_card, uint16_t caid, uint8_t slot, uint16_t s void gbox_remove_bad_sid(uint16_t id_peer, uint8_t id_slot, uint16_t sid); uint8_t gbox_next_free_slot(uint16_t id); uint8_t gbox_get_cards_for_ecm(uint8_t *send_buf, int32_t len2, uint8_t max_cards, ECM_REQUEST *er, uint32_t *current_avg_card_time, uint16_t peer_id, uint8_t force_remm); +uint8_t gbox_get_crd_dist_lev(uint16_t crd_id); #endif #endif diff --git a/module-gbox.c b/module-gbox.c index bbeb2084..801f7f67 100644 --- a/module-gbox.c +++ b/module-gbox.c @@ -20,12 +20,13 @@ #include "oscam-reader.h" #include "oscam-files.h" #include "module-gbox-remm.h" +#include "module-dvbapi.h" static struct gbox_data local_gbox; static int8_t local_gbox_initialized = 0; static uint8_t local_cards_initialized = 0; static time_t last_stats_written; -uint8_t local_gbx_rev = 0x10; +uint8_t local_gbx_rev = 0x20; static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er); @@ -222,7 +223,7 @@ void gbox_write_version(void) cs_log("Couldn't open %s: %s", get_gbox_tmp_fname(FILE_GBOX_VERSION), strerror(errno)); return; } - fprintf(fhandle, "%02X.%02X my-id: %04X\n", LOCAL_GBOX_MAJOR_VERSION, cfg.gbox_my_vers, local_gbox.id); + fprintf(fhandle, "%02X.%02X my-id: %04X rev: %01X.%01X\n", LOCAL_GBOX_MAJOR_VERSION, cfg.gbox_my_vers, local_gbox.id, local_gbx_rev >> 4, local_gbx_rev & 0xf); fclose(fhandle); } @@ -261,9 +262,6 @@ void gbox_free_cards_pending(ECM_REQUEST *er) void gbox_init_ecm_request_ext(struct gbox_ecm_request_ext *ere) { - ere->gbox_hops = 0; - ere->gbox_peer = 0; - ere->gbox_mypeer = 0; ere->gbox_slot = 0; ere->gbox_version = 0; ere->gbox_rev = 0; @@ -1009,13 +1007,14 @@ static int8_t gbox_incoming_ecm(struct s_client *cli, uint8_t *data, int32_t n) // GBOX_MAX_HOPS not violated if (data[n - 15] + 1 > GBOX_MAXHOPS) { + cs_log("-> incoming ECM distance: %d > max ECM distance: %d", data[n - 15] + 1, GBOX_MAXHOPS); return -1; } // ECM must not take more hops than allowed by gbox_reshare if (data[n - 15] + 1 > cli->reader->gbox_reshare) { - cs_log("-> ECM took more hops than allowed from gbox_reshare. Hops stealing detected!"); + cs_log("-> incoming ECM dist: %d more than allowed from specified gbox_reshare: %d", data[n - 15] + 1, cli->reader->gbox_reshare); return -1; } @@ -1048,8 +1047,6 @@ static int8_t gbox_incoming_ecm(struct s_client *cli, uint8_t *data, int32_t n) er->src_data = ere; gbox_init_ecm_request_ext(ere); - er->gbox_ecm_id = peer->gbox.id; - if(peer->ecm_idx == 100) { peer->ecm_idx = 0; @@ -1077,28 +1074,28 @@ static int8_t gbox_incoming_ecm(struct s_client *cli, uint8_t *data, int32_t n) er->caid = b2i(2, ecm + er->ecmlen + 5); } - memcpy(er->ecm, data + 18, er->ecmlen); - ere->gbox_peer = b2i(2, ecm + er->ecmlen); + memcpy(er->ecm, data + 18, er->ecmlen); + + er->gbox_ecm_src_peer = b2i(2, ecm + er->ecmlen); //boxid which ORIGINALLY broadcasted the ECM ere->gbox_version = ecm[er->ecmlen + 2]; ere->gbox_rev = ecm[er->ecmlen + 3]; ere->gbox_type = ecm[er->ecmlen + 4]; - uint32_t caprovid = b2i(4, ecm + er->ecmlen + 5); - ere->gbox_mypeer = b2i(2, ecm + er->ecmlen + 10); + uint32_t caprovid = b2i(4, ecm + er->ecmlen + 5); + er->gbox_cw_src_peer = b2i(2, ecm + er->ecmlen + 10); //boxid to send ECM to (cw source peer) ere->gbox_slot = ecm[er->ecmlen + 12]; diffcheck = gbox_checkcode_recv(cl, data + n - 14); //TODO: What do we do with our own checkcode @-7? er->gbox_crc = gbox_get_checksum(&er->ecm[0], er->ecmlen); - ere->gbox_hops = data[n - 15] + 1; - memcpy(&ere->gbox_routing_info[0], &data[n - 15 - ere->gbox_hops + 1], ere->gbox_hops - 1); + er->gbox_ecm_dist = data[n - 15] + 1; er->caid = gbox_get_caid(caprovid); er->prid = gbox_get_provid(caprovid); peer->gbox_rev = ecm[er->ecmlen + 3]; - cs_log_dbg(D_READER, "-> ECM (-> %d) caid: %04X sid: %04X from peer: %04X rev: %01X.%01X (%s:%d)", - ere->gbox_hops, er->caid, er->srvid, ere->gbox_peer, peer->gbox_rev >> 4, - peer->gbox_rev & 0x0f, peer->hostname, cli->port); + cs_log_dbg(D_READER,"-> ECM (->%d) - ecm-requesting-peer: %04X - cw_src_peer: %04X caid: %04X sid: %04X from_peer: %04X rev: %01X.%01X (%s:%d)", + er->gbox_ecm_dist, er->gbox_ecm_src_peer, er->gbox_cw_src_peer, er->caid, er->srvid, peer->gbox.id, peer->gbox_rev >> 4, + peer->gbox_rev & 0xf, peer->hostname, cli->port); get_cw(cl, er); @@ -1128,6 +1125,7 @@ static uint32_t gbox_get_pending_time(ECM_REQUEST *er, uint16_t peer_id, uint8_t if ((pending->id.peer == peer_id) && (pending->id.slot == slot)) { ret_time = pending->pending_time; + er->gbox_cw_src_peer = peer_id; break; } } @@ -1135,7 +1133,7 @@ static uint32_t gbox_get_pending_time(ECM_REQUEST *er, uint16_t peer_id, uint8_t return ret_time; } -static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, uint8_t *data, int32_t n) +static int32_t gbox_chk_recvd_dcw(struct s_client *cli, uint8_t *dcw, int32_t *rc, uint8_t *data, int32_t n) { if(!cli || gbox_decode_cmd(data) != MSG_CW || n < 44) { @@ -1157,7 +1155,7 @@ static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, ui if (!proxy || !proxy->reader) { - cs_log("error, gbox_recv_chk, proxy not found"); + cs_log("error, gbox_chk_recvd_dcw, proxy not found"); gbox_send_goodbye(cli); return -1; } @@ -1167,9 +1165,8 @@ static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, ui memcpy(dcw, data + 14, 16); uint32_t crc = b2i(4, data + 30); char tmp[32]; - - cs_log_dbg(D_READER, "-> dcw=%s, from peer=%04X, ecm_pid=%04X, sid=%04X, crc=%08X, type=%02X, dist=%01X, unkn=%01X, rev=%01X.%01X, chid=%04X", - cs_hexdump(0, dcw, 32, tmp, sizeof(tmp)), data[10] << 8 | data[11], data[6] << 8 | data[7], + cs_log_dbg(D_READER,"-> CW (->%d) received cw: %s from CW-source-peer=%04X, caid=%04X, slot= %d, ecm_pid=%04X, sid=%04X, crc=%08X, cw-src-type=%d, cw-dist=%d, hw-type=%d, rev=%01X.%01X, chid=%04X", data[42] & 0x0f, + cs_hexdump(0, dcw, 32, tmp, sizeof(tmp)), data[10] << 8 | data[11], data[34] << 8 | data[35], data[36], data[6] << 8 | data[7], data[8] << 8 | data[9], crc, data[41], data[42] & 0x0f, data[42] >> 4, data[43] >> 4, data[43] & 0x0f, data[37] << 8 | data[38]); @@ -1184,7 +1181,6 @@ static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, ui id_card = b2i(2, data + 10); cw_time = comp_timeb(&t_now, &proxy->ecmtask[i].tps) - gbox_get_pending_time(&proxy->ecmtask[i], id_card, data[36]); gbox_add_good_sid(id_card, proxy->ecmtask[i].caid, data[36], proxy->ecmtask[i].srvid, cw_time); - proxy->reader->currenthops = data[42] & 0x0f; gbox_remove_all_bad_sids(&proxy->ecmtask[i], proxy->ecmtask[i].srvid); if(proxy->ecmtask[i].gbox_ecm_status == GBOX_ECM_NOT_ASKED || proxy->ecmtask[i].gbox_ecm_status == GBOX_ECM_ANSWERED) @@ -1193,7 +1189,10 @@ static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, ui } proxy->ecmtask[i].gbox_ecm_status = GBOX_ECM_ANSWERED; - proxy->ecmtask[i].gbox_ecm_id = id_card; + proxy->ecmtask[i].gbox_cw_src_peer = id_card; + proxy->reader->currenthops = gbox_get_crd_dist_lev(id_card) & 0xf; + proxy->reader->gbox_cw_src_peer = id_card; + proxy->reader->gbox_crd_slot_lev = (data[36] << 4) | ((gbox_get_crd_dist_lev(id_card) >> 4) & 0xf); *rc = 1; return proxy->ecmtask[i].idx; } @@ -1208,11 +1207,10 @@ static int32_t gbox_recv_chk(struct s_client *cli, uint8_t *dcw, int32_t *rc, ui static int8_t gbox_received_dcw(struct s_client *cli, uint8_t *data, int32_t n) { - struct gbox_peer *peer = cli->gbox; int32_t rc = 0, i = 0, idx = 0; uint8_t dcw[16]; - idx = gbox_recv_chk(cli, dcw, &rc, data, n); + idx = gbox_chk_recvd_dcw(cli, dcw, &rc, data, n); if(idx < 0) // no dcw received { @@ -1224,7 +1222,6 @@ static int8_t gbox_received_dcw(struct s_client *cli, uint8_t *data, int32_t n) idx = cli->last_idx; } - peer->gbox_rev = data[43]; cli->reader->last_g = time((time_t *)0); // for reconnect timeout for(i = 0; i < cfg.max_pending; i++) @@ -1593,11 +1590,9 @@ static int8_t gbox_check_header_recvd(struct s_client *cli, struct s_client *pro cs_log_dbg(D_READER, "-> CW data from peer: %04X data: %s", cli->gbox_peer_id, cs_hexdump(0, data, l, tmp, sizeof(tmp))); - // if my pass ok verify CW | pass to peer if((data[39] != ((local_gbox.id >> 8) & 0xff)) || (data[40] != (local_gbox.id & 0xff))) { - cs_log("gbox peer: %04X sends CW for other than my id: %04X", cli->gbox_peer_id, local_gbox.id); - return -1; + cs_log_dbg(D_READER,"peer: %04X sends CW not to my id: %04X -> forwarding CW to requesting peer %02X%02X ", cli->gbox_peer_id, local_gbox.id, data[39], data[40]); } } } @@ -1690,6 +1685,18 @@ static int32_t gbox_recv(struct s_client *cli, uint8_t *buf, int32_t l) return 0; } +static uint8_t check_setup( void) +{ +#ifdef HAVE_DVBAPI + if (module_dvbapi_enabled()) + { return 0x30; } //stb + else + { return 0x50; } +#else + return 0x50; //server +#endif +} + static void gbox_send_dcw(struct s_client *cl, ECM_REQUEST *er) { if (!cl || !er) @@ -1725,7 +1732,7 @@ static void gbox_send_dcw(struct s_client *cl, ECM_REQUEST *er) gbox_message_header(buf, MSG_CW , peer->gbox.password, 0); i2b_buf(2, er->pid, buf + 6); // PID i2b_buf(2, er->srvid, buf + 8); // SrvID - i2b_buf(2, ere->gbox_mypeer, buf + 10); // From peer + i2b_buf(2, er->gbox_cw_src_peer, buf + 10); // From peer - source of cw buf[12] = (ere->gbox_slot << 4) | (er->ecm[0] & 0x0f); // slot << 4 | even/odd buf[13] = er->caid >> 8; // CAID first byte memcpy(buf + 14, er->cw, 16); // CW @@ -1751,36 +1758,40 @@ static void gbox_send_dcw(struct s_client *cl, ECM_REQUEST *er) } } - i2b_buf(2, ere->gbox_peer, buf + 39); // Target peer + i2b_buf(2, er->gbox_ecm_src_peer, buf + 39); // Target peer to recv cw if(er->rc == E_CACHE1 || er->rc == E_CACHE2 || er->rc == E_CACHEEX) { buf[41] = 0x03; } // source of cw -> cache else { buf[41] = 0x01; } // source of cw -> card, emu + + uint8_t cw_dist = gbox_get_crd_dist_lev(er->gbox_cw_src_peer) & 0xf; + + buf[42] = ((check_setup()) | (cw_dist + 1)); + buf[43] = ere->gbox_rev & 0xf0; + + //buf[44] = 0; + //gbox_send(cli, buf, 45); + + uint8_t i; + for(i = 0; i < er->gbox_ecm_dist; i++) + { + buf[44 +i] = i; + } - buf[42] = 0x30; // 1st nibble unknown / 2nd nibble distance // to fix - dist always 0 - //buf[42] = 0x30 | (ere->gbox_hops & 0x0f); - buf[43] = ere->gbox_rev; - //buf[43] = local_gbx_rev; - - // This copies the routing info from ECM to answer. - // Each hop adds one byte and number of hops is in er->gbox_hops. - memcpy(&buf[44], &ere->gbox_routing_info, ere->gbox_hops - 1); - buf[44 + ere->gbox_hops - 1] = ere->gbox_hops - 1; // Hops + gbox_send(cli, buf, 44 + er->gbox_ecm_dist); /* char tmp[0x50]; - cs_log("sending dcw to peer : %04x data: %s", er->gbox_peer, cs_hexdump(0, buf, er->gbox_hops + 44, tmp, sizeof(tmp))); + cs_log("sending dcw to peer : %04x data: %s", er->gbox_ecm_src_peer, cs_hexdump(0, buf, er->gbox_ecm_dist + 44, tmp, sizeof(tmp))); */ - gbox_send(cli, buf, ere->gbox_hops + 44); // to fix: ere->gbox_hops always 1 - - if(ere->gbox_rev >> 4) + if(ere->gbox_rev >> 4) { gbox_send_remm_req(cli, er); } - cs_log_dbg(D_READER, "<- CW (<- %d) from %04X to %04X rev:%01X.%01X %s port:%d", - ere->gbox_hops, ere->gbox_mypeer, ere->gbox_peer, ere->gbox_rev >> 4, - ere->gbox_rev & 0x0f, cli->reader->label, cli->port); + cs_log_dbg(D_READER,"<- CW (<-%d) caid; %04X from cw-source-peer: %04X forward to ecm-requesting-peer: %04X - forwarding peer: %04X %s rev:%01X.%01X port:%d", + er->gbox_ecm_dist, er->caid, er->gbox_cw_src_peer, er->gbox_ecm_src_peer, peer->gbox.id, cli->reader->label, + ere->gbox_rev >> 4, ere->gbox_rev & 0xf, cli->port); } /* // see r11270 @@ -1871,13 +1882,6 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) er->gbox_cards_pending = ll_create("pending_gbox_cards"); } - if(er->gbox_ecm_id == peer->gbox.id) - { - cs_log_dbg(D_READER, "%s provided ecm", cli->reader->label); - write_ecm_answer(cli->reader, er, E_NOTFOUND, 0x27, NULL, NULL, 0, NULL); - return 0; - } - uint8_t send_buf[1024]; int32_t buflen, len1; @@ -1901,21 +1905,27 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) i2b_buf(2, er->srvid, send_buf + 12); send_buf[14] = 0x00; send_buf[15] = 0x00; - //send_buf[16] = nb_matching_crds; //Number of cards the ECM should be forwarded to send_buf[17] = 0x00; memcpy(send_buf + 18, er->ecm, er->ecmlen); - i2b_buf(2, local_gbox.id, send_buf + len1); + if(!er->gbox_ecm_dist) + { + er->gbox_ecm_src_peer = local_gbox.id; + i2b_buf(2, local_gbox.id, send_buf + len1); //local boxid first broadcasted the ECM + send_buf[len1 + 3] = 0x4; + } + else + { + i2b_buf(2, er->gbox_ecm_src_peer, send_buf + len1); //forward boxid that originally broadcasted the ECM + send_buf[len1 + 3] = 0; + } + send_buf[len1 + 2] = cfg.gbox_my_vers; if(check_valid_remm_peer( peer->gbox.id)) { send_buf[len1 + 3] = local_gbx_rev; } - else - { - send_buf[len1 + 3] = 0x00; - } send_buf[len1 + 4] = gbox_get_my_cpu_api(); @@ -1935,7 +1945,7 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) if(!nb_matching_crds && er->gbox_ecm_status == GBOX_ECM_NOT_ASKED) { - cs_log_dbg(D_READER, "no valid card found for CAID: %04X PROVID: %04X", er->caid, er->prid); + cs_log_dbg(D_READER, "no valid card found for CAID: %04X PROV: %06X", er->caid, er->prid); write_ecm_answer(cli->reader, er, E_NOTFOUND, E2_CCCAM_NOCARD, NULL, NULL, 0, NULL); return -1; } @@ -1945,15 +1955,21 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) send_buf[16] = nb_matching_crds; // Number of cards the ECM should be forwarded to // distance ECM - send_buf[buflen] = 0; // fix me! if ecm to be forwarded -> must add +1 - buflen++; + uint8_t i; + for(i = 0; i < er->gbox_ecm_dist + 1; i++) + { + send_buf[buflen] = i; + buflen++; + } + + // send_buf[buflen] = er->gbox_ecm_dist +=1; + // buflen++; memcpy(&send_buf[buflen], gbox_get_my_checkcode(), 7); buflen = buflen + 7; memcpy(&send_buf[buflen], peer->checkcode, 7); buflen = buflen + 7; - uint32_t i = 0; struct gbox_card_pending *pending = NULL; struct timeb t_now; cs_ftime(&t_now); @@ -1977,8 +1993,8 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) LL_LOCKITER *li = ll_li_create(er->gbox_cards_pending, 0); while ((pending = ll_li_next(li))) { - cs_log_dbg(D_READER, "Pending Card ID: %04X Slot: %02X Time: %d", - pending->id.peer, pending->id.slot, pending->pending_time); + cs_log_dbg(D_READER, "Pending Card ID: %04X Slot: %02X time: %d", pending->id.peer, pending->id.slot, pending->pending_time); + er->gbox_cw_src_peer = pending->id.peer; } ll_li_destroy(li); @@ -1999,8 +2015,8 @@ static int32_t gbox_send_ecm(struct s_client *cli, ECM_REQUEST *er) cli->pending++; } - cs_log_dbg(D_READER, "sending ecm for %04X@%06X sid: %04X to %d card(s) of %s", - er->caid, er->prid , er->srvid, nb_matching_crds, cli->reader->label); + cs_log_dbg(D_READER,"<- ECM (<-%d) - caid: %04X prov: %06X sid: %04X to %d card(s) of cw-src-peer: %04X - ecm_src_peer: %04X", + gbox_get_crd_dist_lev(er->gbox_cw_src_peer) & 0xf, er->caid, er->prid, er->srvid, nb_matching_crds, er->gbox_cw_src_peer, er->gbox_ecm_src_peer); gbox_send(cli, send_buf, buflen); cli->reader->last_s = time((time_t *) 0); @@ -2391,7 +2407,6 @@ void module_gbox(struct s_module *ph) ph->send_dcw = gbox_send_dcw; ph->recv = gbox_recv; ph->c_init = gbox_peer_init; - ph->c_recv_chk = gbox_recv_chk; ph->c_send_ecm = gbox_send_ecm; ph->c_send_emm = gbox_send_remm_data; ph->s_peer_idle = gbox_peer_idle; diff --git a/oscam-ecm.c b/oscam-ecm.c index 9b2ca49d..8d8e7a3e 100644 --- a/oscam-ecm.c +++ b/oscam-ecm.c @@ -2817,11 +2817,10 @@ int32_t format_ecm(ECM_REQUEST *ecm, char *result, size_t size) #endif cs_hexdump(0, ecm->cw, 16, cwhex, sizeof(cwhex)); #ifdef MODULE_GBOX - struct gbox_ecm_request_ext *ere = ecm->src_data; - if(ere && check_client(ecm->client) && get_module(ecm->client)->num == R_GBOX && ere->gbox_hops) - { return ecmfmt(result, size, ecm->caid, ecm->onid, ecm->prid, ecm->chid, ecm->pid, ecm->srvid, ecm->ecmlen, ecmd5hex, csphash, cwhex, ere->gbox_peer, ere->gbox_hops, payload, tier); } - else if (ecm->selected_reader && ecm->selected_reader->typ == R_GBOX && ecm->gbox_ecm_id) - { return ecmfmt(result, size, ecm->caid, ecm->onid, ecm->prid, ecm->chid, ecm->pid, ecm->srvid, ecm->ecmlen, ecmd5hex, csphash, cwhex, ecm->gbox_ecm_id, 0, payload, tier); } + if(check_client(ecm->client) && get_module(ecm->client)->num == R_GBOX && ecm->gbox_ecm_dist) + { return ecmfmt(result, size, ecm->caid, ecm->onid, ecm->prid, ecm->chid, ecm->pid, ecm->srvid, ecm->ecmlen, ecmd5hex, csphash, cwhex, ecm->gbox_ecm_src_peer, ecm->gbox_ecm_dist, payload, tier); } + else if (ecm->selected_reader && ecm->selected_reader->typ == R_GBOX && !ecm->gbox_ecm_dist) + { return ecmfmt(result, size, ecm->caid, ecm->onid, ecm->prid, ecm->chid, ecm->pid, ecm->srvid, ecm->ecmlen, ecmd5hex, csphash, cwhex, ecm->selected_reader->gbox_cw_src_peer, ecm->selected_reader->currenthops, payload, tier); } else #endif return ecmfmt(result, size, ecm->caid, ecm->onid, ecm->prid, ecm->chid, ecm->pid, ecm->srvid, ecm->ecmlen, ecmd5hex, csphash, cwhex, 0, diff --git a/webif/config/dvbapi.html b/webif/config/dvbapi.html index 8f48ec48..52a45e04 100644 --- a/webif/config/dvbapi.html +++ b/webif/config/dvbapi.html @@ -42,6 +42,7 @@ + diff --git a/webif/readerconfig/readerconfig_gboxbit.html b/webif/readerconfig/readerconfig_gboxbit.html index 0816f951..318b63d8 100644 --- a/webif/readerconfig/readerconfig_gboxbit.html +++ b/webif/readerconfig/readerconfig_gboxbit.html @@ -14,7 +14,7 @@ - + diff --git a/webif/readerconfig/readerinfo_gbox_remm.html b/webif/readerconfig/readerinfo_gbox_remm.html index 6b055fdd..aac162b9 100644 --- a/webif/readerconfig/readerinfo_gbox_remm.html +++ b/webif/readerconfig/readerinfo_gbox_remm.html @@ -1,6 +1,6 @@ - +
Max Peer Distance: Receive max Peer Distance: Max Ecm Send: Locals reshare:
Gbox Remote EMM
Force REMM:
INFO: REMM Request from Peer:
Client Info: REMM Request from Server Peer: