./ MultiCS.r69 / ecmdata.h
#define MAX_ECM_DATA 5000 #define ECM_SRV_REQUEST 0 #define ECM_SRV_REPLY_GOOD 1 #define ECM_SRV_REPLY_FAIL 2 #define ECM_SRV_EXCLUDE 3 // cachestatus #define ECM_CACHE_NONE 0 #define ECM_CACHE_REQ 1 #define ECM_CACHE_REQ2 2 #define ECM_CACHE_REP 3 typedef enum { STAT_DCW_FAILED, // decode failed STAT_DCW_WAIT, // Wait servers answer STAT_DCW_WAITCACHE, // Wait cached servers answer STAT_DCW_SUCCESS // dcw returned } dcwstatus_type; #define DCW_SOURCE_NONE 0 #define DCW_SOURCE_CACHE 1 #define DCW_SOURCE_SERVER 2 #ifdef SRV_CSCACHE #define DCW_SOURCE_CSCLIENT 3 #define DCW_SOURCE_MGCLIENT 4 #endif typedef struct { // Ecm Data unsigned int csid; // cardserver unique id uint32 recvtime; // First request time in ms received from client uint32 lastrecvtime; // Last request time received from client uint32 lastsendtime; // Last request Time sent to server uint16 sid; // Service id uint16 caid; // CA id uint32 provid; // Provider uint16 chid; // for irdeto int ecmlen; uint8 ecm[512]; uint32 crc; uint32 hash; // DCW/Status dcwstatus_type dcwstatus; uint8 cw[16]; // DCW SOURCE int dcwsrctype; int dcwsrcid; //int peerid; // Cache PeerID sending dcw(0=nothing) unsigned int checktime; // time when recheck the ecm. unsigned char cachestatus;// 0:nothing sent;; 1:request sent;; 2:reply sent char *statusmsg; // DCW status message #ifdef CHECK_NEXTDCW // Last Successive ECM/DCW struct { int status; //0: nothing, 1: found last decode, -1:error dont search uint8 dcw[16]; int error; int ecmid; int counter; // successif dcw counter * -1:error, 0: not found, 1: found and checked 1 time, 2: found and checked 2 times ... uint dcwchangetime; } lastdecode; #endif // SERVERS that received ecm request struct { unsigned int sendtime; // ECM request sent time unsigned int statustime; // Last Status Time uint32 srvid; // Server ID 0=nothing int flag; // 0=request , 1=reply, 2: excluded(like cccam) uint8 dcw[16]; } server[20]; int waitcache; // 1: Wait for Cache; 0: dont wait int srvmsgid; uint32 iplist[20]; // Clients ip list: to Remove Circular request: check for client ip & srv ip } ECM_DATA; extern ECM_DATA ecmdata[MAX_ECM_DATA]; void init_ecmdata(); uint32 ecm_crc( uchar *ecm, int ecmlen); unsigned int hashCode( unsigned char *buf, int count); ECM_DATA *getecmbyid(int id); int prevecmid( int ecmid ); int nextecmid( int ecmid ); void ecm_addip( int ecmid, unsigned int ip); int ecm_checkip( int ecmid, unsigned int ip); uint32_t ecm_getprovid( uint8_t *ecm, uint16_t caid ); uint16_t ecm_getchid( uint8_t *ecm, uint16_t caid ); int store_ecmdata(int csid,uchar *ecm,int ecmlen, unsigned short sid, unsigned short caid, unsigned int provid); int search_ecmdata( uchar *ecm, int ecmlen, unsigned short sid); int search_ecmdata_dcw( uchar *ecm, int ecmlen, unsigned short sid); int search_ecmdata_bymsgid( int msgid ); int search_ecmdata_byhash( uint32 hash ); int ecm_addsrv(ECM_DATA *ecm, unsigned srvid); int ecm_nbsentsrv(ECM_DATA *ecm); int ecm_nbwaitsrv(ECM_DATA *ecm); int ecm_setsrvflag(int ecmid, unsigned int srvid, int flag); int ecm_setsrvflagdcw(int ecmid, unsigned int srvid, int flag, uchar dcw[16]); int ecm_getsrvflag(int ecmid, unsigned int srvid); int ecm_getreplysrvid(int ecmid); int search_ecmdata_bycw( unsigned char *cw, uint32 hash, unsigned short sid, unsigned short caid, unsigned int provid); #ifdef CHECK_NEXTDCW int checkfreeze_setdcw( int ecmid, uchar dcw[16] ); #endif extern int srvmsgid;