1 /* DVB CI Transport Connection */
3 #include <lib/dvb_ci/dvbci_session.h>
5 eDVBCISession::eDVBCISession(eDVBCISlot *cislot)
10 int eDVBCISession::buildLengthField(unsigned char *pkt, int len)
21 } else if (len < 65535)
29 printf("too big length\n");
34 int eDVBCISession::parseLengthField(const unsigned char *pkt, int &len)
42 for (int i=0; i<(pkt[0]&0x7F); ++i)
47 return (pkt[0] & 0x7F) + 1;
50 void eDVBCISession::sendSPDU(eDVBCISlot *slot, unsigned char tag, const void *data, int len, unsigned short session_nb, const void *apdu,int alen)
52 unsigned char pkt[4096];
53 unsigned char *ptr=pkt;
55 ptr+=buildLengthField(ptr, len+2);
57 memcpy(ptr, data, len);
63 memcpy(ptr, apdu, alen);
66 slot->write(pkt, ptr - pkt);
69 void eDVBCISession::sendOpenSessionResponse(eDVBCISlot *slot, unsigned char session_status, const unsigned char *resource_identifier, unsigned short session_nb)
72 pkt[0]=session_status;
73 printf("sendOpenSessionResponse\n");
74 memcpy(pkt + 1, resource_identifier, 4);
75 sendSPDU(slot, 0x92, pkt, 5, session_nb);
78 eDVBCISession *eDVBCISession::createSession(eDVBCISlot *slot, const unsigned char *resource_identifier, unsigned char &status)
80 eDVBCISession *session;
82 unsigned short session_nb;
83 for (session_nb=1; session_nb < SLMS; ++session_nb)
84 if (!sessions[session_nb-1])
86 if (session_nb == SLMS)
92 tag = resource_identifier[0] << 24;
93 tag|= resource_identifier[1] << 16;
94 tag|= resource_identifier[2] << 8;
95 tag|= resource_identifier[3];
100 // session=new eDVBCIResourceManagerSession;
101 printf("RESOURCE MANAGER\n");
104 // session=eDVBCIModule::getInstance()->application_manager = new eDVBCIApplicationManagerSession;
105 printf("APPLICATION MANAGER\n");
108 // session=eDVBCIModule::getInstance()->ca_manager=new eDVBCICAManagerSession;
109 printf("CA MANAGER\n");
112 // session=new eDVBCIDateTimeSession;
113 printf("DATE-TIME\n");
116 // session=new eDVBCIMMISession;
120 // session=new eDVBCIAuthSession;
121 printf("AuthSession\n");
125 printf("unknown resource type %02x %02x %02x %02x\n", resource_identifier[0], resource_identifier[1], resource_identifier[2],resource_identifier[3]);
132 printf("unknown session.. expect crash\n");
135 printf("new session_nb: %d\n", session_nb);
136 session->session_nb = session_nb;
139 printf("session ok, status %02x\n", session->status);
140 status = session->getStatus();
146 sessions[session_nb - 1] = session;
147 session->slot = slot;
149 session->state = stateInCreation;
153 void eDVBCISession::receiveData(const unsigned char *ptr, size_t len)
155 const unsigned char *pkt = (const unsigned char*)ptr;
156 unsigned char tag = *pkt++;
159 llen = parseLengthField(pkt, hlen);
162 eDVBCISession *session = NULL;
166 unsigned char status;
167 session = createSession(slot, pkt, status);
168 sendOpenSessionResponse(slot, status, pkt, session?session->session_nb:0);
172 session->state=stateStarted;