Changeset 4712 for trunk/module-cccam.c
- Timestamp:
- 02/12/11 17:19:49 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-cccam.c
r4690 r4712 1 #include <string.h>1 #include <string.h> 2 2 #include <stdlib.h> 3 3 #include "globals.h" … … 978 978 if (er) { 979 979 er->rc = E_RDR_NOTFOUND; 980 er->rcEx = 0x27;980 er->rcEx = E2_CCCAM_NOCARD; 981 981 cs_debug_mask(D_READER, "%s server not init! ccinit=%d pfd=%d", 982 982 rdr->label, cc ? 1 : 0, cl->pfd); … … 1147 1147 1148 1148 cur_er->rc = E_RDR_NOTFOUND; 1149 cur_er->rcEx = 0x27;1149 cur_er->rcEx = E2_CCCAM_NOCARD; 1150 1150 write_ecm_answer(rdr, cur_er); 1151 1151 //cur_er->rc = 1; … … 1352 1352 ll_destroy_data(card->remote_nodes); 1353 1353 1354 free(card);1354 add_garbage(card); 1355 1355 } 1356 1356 … … 1944 1944 1945 1945 struct cc_card *card = read_card(data, buf[1]==MSG_NEW_CARD_SIDINFO); 1946 card->origin_reader = rdr; 1946 1947 1947 1948 //Check if this card is from us: … … 2072 2073 remove_good_sid(card, &srvid); 2073 2074 2074 //retry ecm: 2075 cc_reset_pending(cl, ecm_idx); 2075 if (cfg.cc_forward_origin_card && card->origin_reader == rdr) { 2076 //this card is from us but it can't decode this ecm 2077 //also origin card is only set on cccam clients 2078 //so wie send back the nok to the client 2079 int i = 0; 2080 for (i=0;i<CS_MAXPENDING;i++) { 2081 if (cl->ecmtask[i].idx == ecm_idx) { 2082 cs_debug_mask(D_TRACE, "%s forward card: %s", getprefix(), (buf[1]==MSG_CW_NOK1)?"NOK1":"NOK2"); 2083 ECM_REQUEST *er = &cl->ecmtask[i]; 2084 er->rc = E_RDR_NOTFOUND; 2085 er->rcEx = (buf[1] == MSG_CW_NOK1)?E2_CCCAM_NOK1:E2_CCCAM_NOK2; 2086 write_ecm_answer(rdr, er); 2087 break; 2088 } 2089 } 2090 } 2091 else { 2092 //retry ecm: 2093 cc_reset_pending(cl, ecm_idx); 2094 } 2076 2095 } else 2077 2096 cs_debug_mask(D_READER, "%S NOK: NO CARD!", getprefix()); … … 2107 2126 cc->server_ecm_pending++; 2108 2127 er->idx = ++cc->server_ecm_idx; 2109 2128 2129 if (cfg.cc_forward_origin_card) { //search my shares for this card: 2130 cs_debug_mask(D_TRACE, "%s forward card: %04X:%04x search share %d", getprefix(), er->caid, er->srvid, server_card->id); 2131 LL_ITER *itr = ll_iter_create(cc->reported_carddatas); 2132 struct cc_card *card; 2133 struct cc_card *rcard = NULL; 2134 while ((card=ll_iter_next(itr))) { 2135 if (card->id == server_card->id) { //found it 2136 break; 2137 } 2138 } 2139 ll_iter_release(itr); 2140 cs_debug_mask(D_TRACE, "%s forward card: share %d found: %d", getprefix(), server_card->id, card?1:0); 2141 if (card && card->origin_reader) { // found own card, now search reader card: 2142 cs_debug_mask(D_TRACE, "%s forward card: share %d origin reader %s origin id %d", getprefix(), card->id, card->origin_reader->label, card->origin_id); 2143 struct s_reader *rdr = card->origin_reader; 2144 if (card->origin_id && rdr && rdr->client && rdr->client->cc) { //only if we have a origin from a cccam reader 2145 struct cc_data *rcc = rdr->client->cc; 2146 2147 itr = ll_iter_create(rcc->cards); 2148 while ((rcard=ll_iter_next(itr))) { 2149 if (rcard->id == card->origin_id) //found it! 2150 break; 2151 } 2152 ll_iter_release(itr); 2153 } 2154 else 2155 rcard = card; 2156 } 2157 2158 er->origin_card = rcard; 2159 if (!rcard) { 2160 cs_debug_mask(D_TRACE, "%s forward card: share %d not found!", getprefix(), server_card->id); 2161 er->rc = E_NOTFOUND; 2162 er->rcEx = E2_CCCAM_NOK1; //share not found! 2163 } 2164 else 2165 cs_debug_mask(D_TRACE, "%s forward card: share %d forwarded to %s origin as id %d", getprefix(), 2166 card->id, card->origin_reader->label, rcard->id); 2167 } 2168 2110 2169 cs_debug_mask( 2111 2170 D_CLIENT, … … 2431 2490 } else if ((buf[1] == (MSG_CW_NOK1)) || (buf[1] == (MSG_CW_NOK2))) { 2432 2491 *rc = 0; 2433 if (cc->is_oscam_cccam) 2492 //if (cc->is_oscam_cccam) 2493 if (cfg.cc_forward_origin_card) 2434 2494 return (cc->recv_ecmtask); 2435 2495 else … … 2472 2532 TRUE); 2473 2533 2474 if (er->rc < E_NOTFOUND && eei && eei->card) { 2534 if (er->rc < E_NOTFOUND && eei && eei->card) { //found: 2475 2535 memcpy(buf, er->cw, sizeof(buf)); 2476 2536 //fix_dcw(buf); … … 2485 2545 cc_crypt(&cc->block[ENCRYPT], buf, 16, ENCRYPT); // additional crypto step 2486 2546 free(eei->card); 2487 } else { 2547 } else { //NOT found: 2488 2548 //cs_debug_mask(D_TRACE, "%s send cw: NOK cpti: %d", getprefix(), 2489 2549 // er->cpti); … … 2495 2555 if (!eei || !eei->card) 2496 2556 nok = MSG_CW_NOK1; //share no more available 2497 else 2498 nok = MSG_CW_NOK2; //can't decode 2557 else { 2558 if (cfg.cc_forward_origin_card && er->origin_card == eei->card) 2559 nok = (er->rcEx==E2_CCCAM_NOK1)?MSG_CW_NOK1:MSG_CW_NOK2; 2560 else 2561 nok = MSG_CW_NOK2; //can't decode 2562 } 2499 2563 cc_cmd_send(cl, NULL, 0, nok); 2500 2564 } … … 2662 2726 copy_sids(card2->goodsids, card->goodsids); 2663 2727 copy_sids(card2->badsids, card->badsids); 2728 card2->origin_reader = card->origin_reader; 2729 card2->origin_id = card->id; 2664 2730 } 2665 2731 … … 2763 2829 2764 2830 //Minimize all, transmit just CAID, merge providers: 2765 if (cfg.cc_minimize_cards == MINIMIZE_CAID ) {2831 if (cfg.cc_minimize_cards == MINIMIZE_CAID && !cfg.cc_forward_origin_card) { 2766 2832 while ((card2 = ll_iter_next(it))) 2767 2833 if (card2->caid == card->caid && … … 2797 2863 2798 2864 //Removed duplicate cards, keeping card with lower hop: 2799 else if (cfg.cc_minimize_cards == MINIMIZE_HOPS ) {2865 else if (cfg.cc_minimize_cards == MINIMIZE_HOPS && !cfg.cc_forward_origin_card) { 2800 2866 while ((card2 = ll_iter_next(it))) { 2801 2867 if (card2->caid == card->caid &&
Note:
See TracChangeset
for help on using the changeset viewer.