Changeset 1961
- Timestamp:
- 04/05/10 20:55:09 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-camd35.c
r1958 r1961 135 135 static void camd35_request_emm(ECM_REQUEST *er) 136 136 { 137 int i, au; 138 time_t now; 139 static time_t last=0; 140 static int disable_counter=0; 141 static uchar lastserial[8]={0,0,0,0,0,0,0,0}; 142 143 au=client[cs_idx].au; 144 if ((au<0) || (au>CS_MAXREADER)) return; // TODO 145 146 time(&now); 147 if (!memcmp(lastserial, reader[au].hexserial, 8)) 148 if (abs(now-last)<180) return; 149 memcpy(lastserial, reader[au].hexserial, 8); 150 last=now; 151 152 if (reader[au].caid[0]) 153 { 154 disable_counter=0; 155 log_emm_request(au); 156 } 157 else 158 if (disable_counter>2) 159 return; 160 else 161 disable_counter++; 162 163 // if (reader[au].hexserial[3]) 164 // { 165 // if (!reader[au].online) 166 // { 167 // memset(lastserial, 0, sizeof(lastserial)); 168 // return; 169 // } 170 memset(mbuf, 0, sizeof(mbuf)); 171 mbuf[2]=mbuf[3]=0xff; // must not be zero 172 memcpy(mbuf+ 8, i2b(2, er->srvid), 2); 173 memcpy(mbuf+12, i2b(4, er->prid ), 4); 174 memcpy(mbuf+16, i2b(2, er->pid ), 2); 175 mbuf[0]=5; 176 mbuf[1]=111; 177 if (reader[au].caid[0]) 178 { 179 mbuf[39]=1; // no. caids 180 mbuf[20]=reader[au].caid[0]>>8; // caid's (max 8) 181 mbuf[21]=reader[au].caid[0]&0xff; 182 memcpy(mbuf+40, reader[au].hexserial, 6); // serial now 6 bytes 183 mbuf[47]=reader[au].nprov; 184 for (i=0; i<reader[au].nprov; i++) 185 { 186 if (((reader[au].caid[0] >= 0x1700) && (reader[au].caid[0] <= 0x1799)) || // Betacrypt 187 ((reader[au].caid[0] >= 0x0600) && (reader[au].caid[0] <= 0x0699))) // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card) 188 { 189 mbuf[48+(i*5)]=reader[au].prid[i][0]; 190 memcpy(&mbuf[50+(i*5)], &reader[au].prid[i][1], 3); 191 } 192 else 193 { 194 mbuf[48+(i*5)]=reader[au].prid[i][2]; 195 mbuf[49+(i*5)]=reader[au].prid[i][3]; 196 memcpy(&mbuf[50+(i*5)], &reader[au].sa[i][0],3); 197 } 198 }/* b_nano old implementation was not working according to documentation, so we changed it 199 mbuf[128]=(reader[au].b_nano[0xd0])?0:1; 200 mbuf[129]=(reader[au].b_nano[0xd2])?0:1; 201 mbuf[130]=(reader[au].b_nano[0xd3])?0:1;*/ 202 //we think client/server protocols should deliver all information, and only readers should discard EMM 203 mbuf[128]=reader[au].blockemm_g; //if 0, GA EMM is blocked 204 mbuf[129]=reader[au].blockemm_s; //if 0, SA EMM is blocked 205 mbuf[130]=reader[au].blockemm_u; //if 0, UA EMM is blocked 206 mbuf[131]=reader[au].card_system; //Cardsystem for Oscam client 207 } 208 else // disable emm 209 mbuf[20]=mbuf[39]=mbuf[40]=mbuf[47]=mbuf[49]=1; 210 memcpy(mbuf+10, mbuf+20, 2); 211 camd35_send(mbuf); // send with data-len 111 for camd3 > 3.890 212 mbuf[1]++; 213 camd35_send(mbuf); // send with data-len 112 for camd3 < 3.890 214 // } 137 int i, au; 138 time_t now; 139 static time_t last = 0; 140 static int disable_counter = 0; 141 static uchar lastserial[8] = {0,0,0,0,0,0,0,0}; 142 143 au = client[cs_idx].au; 144 if ((au < 0) || (au > CS_MAXREADER)) 145 return; // TODO 146 147 time(&now); 148 if (!memcmp(lastserial, reader[au].hexserial, 8)) 149 if (abs(now-last) < 180) return; 150 151 memcpy(lastserial, reader[au].hexserial, 8); 152 last = now; 153 154 if (reader[au].caid[0]) 155 { 156 disable_counter = 0; 157 log_emm_request(au); 158 } 159 else 160 if (disable_counter > 2) 161 return; 162 else 163 disable_counter++; 164 165 memset(mbuf, 0, sizeof(mbuf)); 166 mbuf[2] = mbuf[3] = 0xff; // must not be zero 167 memcpy(mbuf + 8, i2b(2, er->srvid), 2); 168 memcpy(mbuf + 12, i2b(4, er->prid), 4); 169 memcpy(mbuf + 16, i2b(2, er->pid), 2); 170 mbuf[0] = 5; 171 mbuf[1] = 111; 172 if (reader[au].caid[0]) 173 { 174 mbuf[39] = 1; // no. caids 175 mbuf[20] = reader[au].caid[0]>>8; // caid's (max 8) 176 mbuf[21] = reader[au].caid[0]&0xff; 177 memcpy(mbuf + 40, reader[au].hexserial, 6); // serial now 6 bytes 178 mbuf[47] = reader[au].nprov; 179 for (i = 0; i < reader[au].nprov; i++) 180 { 181 if (((reader[au].caid[0] >= 0x1700) && (reader[au].caid[0] <= 0x1799)) || // Betacrypt 182 ((reader[au].caid[0] >= 0x0600) && (reader[au].caid[0] <= 0x0699))) // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card) 183 { 184 mbuf[48 + (i*5)] = reader[au].prid[i][0]; 185 memcpy(&mbuf[50 + (i*5)], &reader[au].prid[i][1], 3); 186 } 187 else 188 { 189 mbuf[48 + (i * 5)] = reader[au].prid[i][2]; 190 mbuf[49 + (i * 5)] =reader[au].prid[i][3]; 191 memcpy(&mbuf[50 + (i * 5)], &reader[au].sa[i][0],4); // for conax we need at least 4 Bytes 192 } 193 } 194 //we think client/server protocols should deliver all information, and only readers should discard EMM 195 mbuf[128] = reader[au].blockemm_g; 196 mbuf[129] = reader[au].blockemm_s; 197 mbuf[130] = reader[au].blockemm_u; 198 mbuf[131] = reader[au].card_system; //Cardsystem for Oscam client 199 } 200 else // disable emm 201 mbuf[20] = mbuf[39] = mbuf[40] = mbuf[47] = mbuf[49] = 1; 202 203 memcpy(mbuf + 10, mbuf + 20, 2); 204 camd35_send(mbuf); // send with data-len 111 for camd3 > 3.890 205 mbuf[1]++; 206 camd35_send(mbuf); // send with data-len 112 for camd3 < 3.890 215 207 } 216 208 … … 509 501 ((reader[ridx].aucaid >= 0x0600) && (reader[ridx].aucaid <= 0x0699))) // Irdeto (don't know if this is correct, cause I don't own a IRDETO-Card) 510 502 { 511 reader[ridx].prid[i][0] = buf[48 +(i*5)];512 memcpy(&reader[ridx].prid[i][1], &buf[50 +(i*5)], 3);503 reader[ridx].prid[i][0] = buf[48 + (i*5)]; 504 memcpy(&reader[ridx].prid[i][1], &buf[50 + (i * 5)], 3); 513 505 } else { 514 reader[ridx].prid[i][2] = buf[48 +(i*5)];515 reader[ridx].prid[i][3] = buf[49+ (i*5)];516 memcpy(&reader[ridx].sa[i][0], &buf[50 +(i*5)], 3);506 reader[ridx].prid[i][2] = buf[48 + (i * 5)]; 507 reader[ridx].prid[i][3] = buf[49+ (i * 5)]; 508 memcpy(&reader[ridx].sa[i][0], &buf[50 + (i * 5)], 4); 517 509 } 518 510 }
Note:
See TracChangeset
for help on using the changeset viewer.