1 | #include "globals.h"
|
---|
2 | #include "reader-common.h"
|
---|
3 | #include "reader-nagra-common.h"
|
---|
4 |
|
---|
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)
|
---|
7 | {
|
---|
8 | switch(ep->emm[0])
|
---|
9 | {
|
---|
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)
|
---|
16 | {
|
---|
17 | ep->type = SHARED;
|
---|
18 | return (!memcmp(rdr->sa[0], ep->hexserial, 0x03));
|
---|
19 | }
|
---|
20 | else
|
---|
21 | {
|
---|
22 | ep->hexserial[3] = ep->emm[6];
|
---|
23 | ep->type = UNIQUE;
|
---|
24 | return (!memcmp(rdr->hexserial + 2, ep->hexserial, 0x04));
|
---|
25 | }
|
---|
26 |
|
---|
27 | case 0x82:
|
---|
28 | ep->type = GLOBAL;
|
---|
29 | return 1;
|
---|
30 |
|
---|
31 | default:
|
---|
32 | ep->type = UNKNOWN;
|
---|
33 | return 1;
|
---|
34 | }
|
---|
35 | }
|
---|
36 |
|
---|
37 | int32_t nagra_get_emm_filter(struct s_reader *rdr, struct s_csystem_emm_filter **emm_filters, unsigned int *filter_count)
|
---|
38 | {
|
---|
39 | if(*emm_filters == NULL)
|
---|
40 | {
|
---|
41 | const unsigned int max_filter_count = 3;
|
---|
42 | if(!cs_malloc(emm_filters, max_filter_count * sizeof(struct s_csystem_emm_filter)))
|
---|
43 | {
|
---|
44 | return ERROR;
|
---|
45 | }
|
---|
46 |
|
---|
47 | struct s_csystem_emm_filter *filters = *emm_filters;
|
---|
48 | *filter_count = 0;
|
---|
49 |
|
---|
50 | int32_t idx = 0;
|
---|
51 |
|
---|
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++;
|
---|
62 |
|
---|
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++;
|
---|
73 |
|
---|
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++;
|
---|
79 |
|
---|
80 | *filter_count = idx;
|
---|
81 | }
|
---|
82 |
|
---|
83 | return OK;
|
---|
84 | }
|
---|