- fix for ticker #4787
[oscam.git] / reader-nagra-common.c
blobeaf40c88c9609198f23b1058397c4682ffc24944
1 #include "globals.h"
2 #include "reader-common.h"
3 #include "reader-nagra-common.h"
5 // returns 1 if shared emm matches SA, unique emm matches serial, or global or unknown
6 int32_t nagra_get_emm_type(EMM_PACKET *ep, struct s_reader *rdr)
8 switch(ep->emm[0])
10 case 0x83:
11 memset(ep->hexserial, 0x00, 0x08);
12 ep->hexserial[0] = ep->emm[5];
13 ep->hexserial[1] = ep->emm[4];
14 ep->hexserial[2] = ep->emm[3];
15 if(ep->emm[7] == 0x10)
17 ep->type = SHARED;
18 return (!memcmp(rdr->sa[0], ep->hexserial, 0x03));
20 else
22 ep->hexserial[3] = ep->emm[6];
23 ep->type = UNIQUE;
24 return (!memcmp(rdr->hexserial + 2, ep->hexserial, 0x04));
27 case 0x82:
28 ep->type = GLOBAL;
29 return 1;
31 default:
32 ep->type = UNKNOWN;
33 return 1;
37 int32_t nagra_get_emm_filter(struct s_reader *rdr, struct s_csystem_emm_filter **emm_filters, unsigned int *filter_count)
39 if(*emm_filters == NULL)
41 const unsigned int max_filter_count = 3;
42 if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
44 return ERROR;
47 struct s_csystem_emm_filter *filters = *emm_filters;
48 *filter_count = 0;
50 int32_t idx = 0;
52 filters[idx].type = EMM_UNIQUE;
53 filters[idx].enabled = 1;
54 filters[idx].filter[0] = 0x83;
55 filters[idx].filter[1] = rdr->hexserial[4];
56 filters[idx].filter[2] = rdr->hexserial[3];
57 filters[idx].filter[3] = rdr->hexserial[2];
58 filters[idx].filter[4] = rdr->hexserial[5];
59 filters[idx].filter[5] = 0x00;
60 memset(&filters[idx].mask[0], 0xFF, 6);
61 idx++;
63 filters[idx].type = EMM_SHARED;
64 filters[idx].enabled = 1;
65 filters[idx].filter[0] = 0x83;
66 filters[idx].filter[1] = rdr->sa[0][2];
67 filters[idx].filter[2] = rdr->sa[0][1];
68 filters[idx].filter[3] = rdr->sa[0][0];
69 filters[idx].filter[4] = 0x00;
70 filters[idx].filter[5] = 0x10;
71 memset(&filters[idx].mask[0], 0xFF, 6);
72 idx++;
74 filters[idx].type = EMM_GLOBAL;
75 filters[idx].enabled = 1;
76 filters[idx].filter[0] = 0x82;
77 filters[idx].mask[0] = 0xFF;
78 idx++;
80 *filter_count = idx;
83 return OK;