*/\r
\r
#include <stdio.h>\r
-#include <stdint.h>\r
-#include <unistd.h>\r
-#include <errno.h>\r
-#include <sys/types.h>\r
-#include <sys/socket.h>\r
-#include <sys/time.h>\r
-#include <sys/un.h>\r
#include <stdlib.h>\r
#include <errno.h>\r
#include <string.h>\r
+#include <unistd.h>\r
+#include <errno.h>\r
+#include <sys/socket.h>\r
#include <sys/un.h>\r
#include <fcntl.h>\r
#include <netinet/in.h>\r
-#include <unistd.h>\r
#include <arpa/inet.h>\r
#include <signal.h>\r
-#include <pthread.h>\r
\r
#include <vdr/pat.h>\r
\r
#include "cc.h"\r
-#include "network.h"\r
-#include "parse.h"\r
-\r
-// START (C) 2002 by Andreas Oberritter <obi@tuxbox.org>\r
-\r
-#define MAX_PIDS 4\r
-\r
-typedef struct descrambleservice_t\r
-{\r
- unsigned char valid;\r
- unsigned char started;\r
- unsigned short status;\r
- unsigned short onID;\r
- unsigned short sID;\r
- unsigned short Unkwn;\r
- unsigned short caID;\r
- unsigned short ecmPID;\r
- unsigned char numpids;\r
- unsigned short pid[MAX_PIDS];\r
-\r
-} descrambleservice_s;\r
-\r
-typedef struct ca_descriptor_s\r
-{\r
- unsigned char descriptor_tag : 8;\r
- unsigned char descriptor_length : 8;\r
- unsigned short ca_system_id : 16;\r
- unsigned char reserved : 3;\r
- unsigned short ca_pid : 13;\r
- unsigned char * private_data_byte;\r
-} __attribute__ ((packed)) ca_descriptor;\r
-\r
-typedef struct ca_pmt_program_info_s\r
-{\r
- unsigned char ca_pmt_cmd_id : 8;\r
- ca_descriptor * descriptor;\r
-} __attribute__ ((packed)) ca_pmt_program_info;\r
-\r
-typedef struct ca_pmt_es_info_s\r
-{\r
- unsigned char stream_type : 8;\r
- unsigned char reserved : 3;\r
- unsigned short elementary_pid : 13;\r
- unsigned char reserved2 : 4;\r
- unsigned short es_info_length : 12;\r
- ca_pmt_program_info * program_info;\r
-} __attribute__ ((packed)) ca_pmt_es_info;\r
-\r
-typedef struct ca_pmt_s\r
-{\r
- unsigned char ca_pmt_list_management : 8;\r
- unsigned short program_number : 16;\r
- unsigned char reserved1 : 2;\r
- unsigned char version_number : 5;\r
- unsigned char current_next_indicator : 1;\r
- unsigned char reserved2 : 4;\r
- unsigned short program_info_length : 12;\r
- ca_pmt_program_info * program_info;\r
- ca_pmt_es_info * es_info;\r
-} __attribute__ ((packed)) ca_pmt;\r
-// END (C) 2002 by Andreas Oberritter <obi@tuxbox.org>\r
+//#include "network.h"\r
+//#include "parse.h"\r
\r
-#define LIST_MORE 0x00 /* CA application should append a 'MORE' CAPMT object the list, and start receiving the next object */\r
-#define LIST_FIRST 0x01 /* CA application should clear the list when a 'FIRST' CAPMT object is received, and start receiving the next object */\r
-#define LIST_LAST 0x02 /* CA application should append a 'LAST' CAPMT object to the list, and start working with the list */\r
#define LIST_ONLY 0x03 /* CA application should clear the list when an 'ONLY' CAPMT object is received, and start working with the object */\r
-#define LIST_ADD 0x04 /* CA application should append an 'ADD' CAPMT object to the current list, and start working with the updated list */\r
-#define LIST_UPDATE 0x05 /* CA application should replace an entry in the list with an 'UPDATE' CAPMT object, and start working with the updated list */\r
-/* ca_pmt_cmd_id's: */\r
-#define CMD_OK_DESCRAMBLING 0x01 /* CA application should start descrambling the service in this CAPMT object, as soon as the list of CAPMT objects is complete */\r
\r
-int parse_ca_pmt ( unsigned char * buffer, unsigned int length);\r
-\r
-// -- cCCcamClient -----------------------------------------------------------\r
+// -- cCardClientCCcam ---------------------------------------------------------\r
\r
class cCardClientCCcam : public cCardClient , private cThread {\r
private:\r
void Writecapmt(int j);\r
int CCSelect(int sd, bool forRead, int s);\r
bool GetCCamCw(unsigned char *cw, int s);\r
- int startportlistener();\r
protected:\r
virtual bool lLogin(int cardnum);\r
virtual void Action(void);\r
cCardClientCCcam(const char *Name);\r
virtual bool Init(const char *CfgDir);\r
virtual bool ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *Cw, int cardnum);\r
- bool CanHandle(unsigned short SysId)\r
-{\r
-if ((SysId & 0xf000) != 0x5000)\r
- return true;\r
-else\r
- return false;\r
-}\r
-\r
-};\r
+ virtual bool CanHandle(unsigned short SysId);\r
+ };\r
\r
static cCardClientLinkReg<cCardClientCCcam> __ncd("CCcam");\r
\r
cCardClientCCcam::cCardClientCCcam(const char *Name)\r
:cCardClient(Name)\r
+,cThread("CCcam listener")\r
{\r
cwccam_fd=-1;\r
pmtversion=0;\r
- ccam_fd[0] = -1;\r
- ccam_fd[1] = -1;\r
- ccam_fd[2] = -1;\r
- ccam_fd[3] = -1;\r
+ ccam_fd[0]=-1; ccam_fd[1]=-1; ccam_fd[2]=-1; ccam_fd[3]=-1;\r
}\r
\r
-\r
bool cCardClientCCcam::Init(const char *config)\r
{\r
cMutexLock lock(this);\r
- int num = 0;\r
+ int num=0;\r
signal(SIGPIPE,SIG_IGN);\r
if(!ParseStdConfig(config,&num)) return false;\r
return true;\r
}\r
\r
+bool cCardClientCCcam::CanHandle(unsigned short SysId)\r
+{\r
+ if((SysId & 0xf000) != 0x5000) return true;\r
+ return false;\r
+}\r
\r
bool cCardClientCCcam::lLogin(int cardnum)\r
{\r
serv_addr_un.sun_family = AF_LOCAL;\r
strcpy(serv_addr_un.sun_path, camdsock);\r
res=connect(ccam_fd[cardnum], (const sockaddr*)&serv_addr_un, sizeof(serv_addr_un));\r
- if (res !=0)\r
- {\r
+ if (res !=0) {\r
PRINTF(L_CC_CCCAM,"Couldnt open camd.socket..... errno = %d Aggg",errno);\r
close(ccam_fd[cardnum]);\r
ccam_fd[cardnum] = -1;\r
- }\r
+ }\r
PRINTF(L_CC_CCCAM,"Opened camd.socket..... ccamd_fd = %d ",ccam_fd[cardnum]);\r
if (cwccam_fd!=-1) return 1;\r
PRINTF(L_CC_CCCAM,"logging in");\r
so=socket(AF_INET, SOCK_DGRAM, 0);\r
- if(so<0)\r
- {\r
+ if(so<0) {\r
close(so);\r
return false;\r
- }\r
+ }\r
bzero(&servAddr, sizeof(servAddr));\r
servAddr.sin_family = AF_INET;\r
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");\r
servAddr.sin_port = htons(port);\r
rc = bind (so, (struct sockaddr *) &servAddr,sizeof(servAddr));\r
- if(rc<0)\r
- {\r
+ if(rc<0) {\r
close(so);\r
PRINTF(L_CC_CCCAM,"not logged in");\r
return false;\r
- }\r
+ }\r
cwccam_fd =so;\r
PRINTF(L_CC_CCCAM,"logged in");\r
- startportlistener();\r
\r
+ PRINTF(L_CC_CCCAM,"starting UDP listener");\r
+ Start();\r
return true;\r
}\r
\r
-\r
bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data, unsigned char *cw, int cardnum)\r
{\r
-\r
// if(((ccam_fd ==0) && !Login()) || !CanHandle(ecm->caId)) return false;\r
//so.Flush();\r
-// cMutexLock lock(this);\r
+ // cMutexLock lock(this);\r
//newcw[cardnum] =0;\r
unsigned char capmt[2048];\r
PRINTF(L_CC_CCCAM,"Processing ECM.... for card %d",cardnum);\r
\r
//PRINTF(L_CC_CCCAM,"Card num beign used... - %d, pid %d progid %d provid %d caid %d",cardnum, pid,ecm->prgId, ecm->provId, ecm->caId );\r
memcpy(capmt,"\x9f\x80\x32\x82\x00\x00", 6);\r
-\r
- capmt[6]=0x01;\r
- //prg-nr\r
- capmt[7]=(unsigned char)((ecm->prgId>>8) & 0xff);\r
- //prg-nr\r
+ capmt[6]=0x01; //prg-nr\r
+ capmt[7]=(unsigned char)((ecm->prgId>>8) & 0xff); //prg-nr\r
capmt[8]=(unsigned char)(ecm->prgId & 0xff);\r
-\r
capmt[9]=pmtversion; //reserved - version - current/next\r
pmtversion++;\r
- pmtversion%=32;\r
- //0x00; reserved - prg-info len\r
- capmt[10]=(unsigned char)((ecm->prgId>>8) & 0xff);\r
- //0x00; prg-info len\r
+ pmtversion%=32; //0x00; reserved - prg-info len\r
+ capmt[10]=(unsigned char)((ecm->prgId>>8) & 0xff); //0x00; prg-info len\r
capmt[11]=(unsigned char)(ecm->prgId & 0xff);\r
// this is ASN.1 this is NOT the way you do BER...\r
capmt[12]=0x01; //CMD_OK_DESCRAMBLING; ca pmt command id\r
capmt[13]=0x81; // private descr.. dvbnamespace\r
capmt[14]=0x08;\r
{\r
- int dvb_namespace = cardnum<<8;\r
- capmt[15]=dvb_namespace>>24;\r
- capmt[16]=(dvb_namespace>>16)&0xFF;\r
- capmt[17]=(dvb_namespace>>8)&0xFF;\r
- capmt[18]=dvb_namespace&0xFF;\r
+ int dvb_namespace = cardnum<<8;\r
+ capmt[15]=dvb_namespace>>24;\r
+ capmt[16]=(dvb_namespace>>16)&0xFF;\r
+ capmt[17]=(dvb_namespace>>8)&0xFF;\r
+ capmt[18]=dvb_namespace&0xFF;\r
}\r
capmt[19]=ecm->transponder>>8;\r
capmt[20]=ecm->transponder&0xFF;\r
capmt[21]=ecm->provId>>8;\r
capmt[22]=ecm->provId&0xFF;\r
-\r
capmt[23]=0x82; // demuxer kram..\r
capmt[24]=0x02;\r
capmt[25]= 1<<cardnum ;\r
capmt[wp++] = cardnum&0xFF;\r
capmt[wp++] = 0x00; //es_length\r
capmt[wp++] = 0x06; //es ca_pmt_cmd_id\r
-\r
capmt[lenpos]=((len & 0xf00)>>8);\r
capmt[lenpos+1]=(len & 0xff);\r
capmt[4]=((wp-6)>>8) & 0xff;\r
capmt[5]=(wp-6) & 0xff;\r
- if (newcw[cardnum])\r
- {\r
- cTimeMs k;\r
- if ((k.Now() - timecw[cardnum]) > 3000)\r
- // just too old lets bin em...\r
- newcw[cardnum] = 0;\r
- }\r
- if ((pid != pids[cardnum]) || (ccam_fd[cardnum] == -1))\r
- { // channel change\r
+ if (newcw[cardnum]) {\r
+ if ((cTimeMs::Now() - timecw[cardnum]) > 3000)\r
+ // just too old lets bin em...\r
+ newcw[cardnum] = 0;\r
+ }\r
+ if ((pid != pids[cardnum]) || (ccam_fd[cardnum] == -1)) { // channel change\r
PRINTF(L_CC_CCCAM,"sending capmts ");\r
pids[cardnum] = pid;\r
newcw[cardnum] =0;\r
lLogin(cardnum);\r
Writecapmt(cardnum);\r
usleep(300000);\r
- }\r
+ }\r
lastcard = cardnum;\r
lastpid = pid;\r
failedcw=0;\r
int u=0;\r
while ((newcw[cardnum] == 0) && (u++<700))\r
usleep(1000); // give the card a chance to decode it...\r
- if (newcw[cardnum] == 0)\r
- {\r
+ if (newcw[cardnum] == 0) {\r
// somethings up, so we will send capmt again.\r
pids[cardnum] = pid;\r
- // memcpy(capmt,sacapmt[cardnum],2048);\r
+ // memcpy(capmt,sacapmt[cardnum],2048);\r
Writecapmt(cardnum);\r
- }\r
+ }\r
u=0;\r
while ((newcw[cardnum] == 0) && (u++<1000))\r
usleep(1000);\r
- if (newcw[cardnum] == 0)\r
- {\r
+ if (newcw[cardnum] == 0) {\r
PRINTF(L_CC_CCCAM,"FAILED ECM FOR CARD %d !!!!!!!!!!!!!!!!!!",cardnum);\r
- sacapmt[cardnum][9]=pmtversion; //reserved - version - current/next\r
- pmtversion++;\r
- pmtversion%=32;\r
+ sacapmt[cardnum][9]=pmtversion; //reserved - version - current/next\r
+ pmtversion++;\r
+ pmtversion%=32;\r
failedcw++;\r
- if (failedcw == 10)\r
- {\r
+ if (failedcw == 10) {\r
// CCcam is having problems lets mark it for a restart....\r
- FILE *i = fopen("/tmp/killCCcam","w+");\r
- fclose(i);\r
-\r
-\r
+ FILE *i = fopen("/tmp/killCCcam","w+");\r
+ fclose(i);\r
}\r
return false;\r
- }\r
+ }\r
memcpy(cw,savedcw[cardnum],16);\r
newcw[cardnum] =0;\r
PRINTF(L_CC_CCCAM," GOT CW FOR CARD %d !!!!!!!!!!!!!!!!!!",cardnum);\r
pmtversion++;\r
pmtversion%=32;\r
failedcw=0;\r
- Writecapmt(cardnum);\r
+ Writecapmt(cardnum);\r
return true;\r
}\r
\r
-\r
void cCardClientCCcam::Writecapmt(int n)\r
{\r
int len;\r
len |= sacapmt[n][5];\r
len += 6;\r
int retry = 1;\r
- while (retry)\r
- {\r
- PRINTF(L_CC_CCCAM,"Writing capmt for card %d %d =================================================",n, sacapmt[n][6]);\r
- if (ccam_fd[n]==-1)\r
- lLogin(n);\r
- if (ccam_fd[n]==-1)\r
- return ;\r
-\r
- int r = write(ccam_fd[n], &sacapmt[n],len );\r
- if (r != len)\r
- {\r
+ while (retry) {\r
+ PRINTF(L_CC_CCCAM,"Writing capmt for card %d %d =================================================",n, sacapmt[n][6]);\r
+ if (ccam_fd[n]==-1)\r
+ lLogin(n);\r
+ if (ccam_fd[n]==-1)\r
+ return ;\r
+\r
+ int r = write(ccam_fd[n], &sacapmt[n],len );\r
+ if (r != len) {\r
PRINTF(L_CC_CCCAM,"CCcam probably has crashed or been killed...");\r
close(ccam_fd[n]);\r
ccam_fd[n]=-1;\r
if (retry > 2)\r
retry =0;\r
}\r
- else\r
- retry =0;\r
- }\r
-}\r
-\r
-\r
-int cCardClientCCcam::startportlistener()\r
-{\r
- PRINTF(L_CC_CCCAM,"starting UDP listener");\r
- SetDescription("CCcamd listener...");\r
- Start();\r
-\r
- return 1;\r
+ else\r
+ retry =0;\r
+ }\r
}\r
\r
-\r
void cCardClientCCcam::Action()\r
{\r
unsigned char cw[18];\r
- while (1)\r
- {\r
- if (GetCCamCw(cw,0))\r
- {\r
- int pid;\r
- cTimeMs k;\r
- pid = cw[0] + (cw[1]<<8);\r
+ while(Running()) {\r
+ if (GetCCamCw(cw,0)) {\r
PRINTF(L_CC_CCCAM," Got: %02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx %02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",\r
- cw[0], cw[1], cw[2], cw[3],\r
- cw[4], cw[5], cw[6], cw[7],\r
- cw[8], cw[9], cw[10], cw[11],\r
- cw[12], cw[13], cw[14], cw[15], cw[16], cw[17]);\r
+ cw[0],cw[1],\r
+ cw[2],cw[3],cw[4],cw[5],cw[6],cw[7],cw[8],cw[9],\r
+ cw[10],cw[11],cw[12],cw[13],cw[14],cw[15],cw[16],cw[17]);\r
\r
- if (cw[1] == 0x0f)\r
- {\r
+ if (cw[1] == 0x0f) {\r
int n = cw[0];\r
- if (memcmp(savedcw[n],cw+2,16))\r
- {\r
- if (newcw[n] == 1)\r
- {\r
+ if (memcmp(savedcw[n],cw+2,16)) {\r
+ if (newcw[n] == 1) {\r
close(ccam_fd[n]);\r
ccam_fd[n]=-1;\r
- }\r
+ }\r
memcpy(savedcw[n],cw+2,16);\r
newcw[n] =1;\r
- timecw[n]= k.Now();\r
+ timecw[n]= cTimeMs::Now();\r
PRINTF(L_CC_CCCAM,"SAVING KEYS USING PID FROM CCCAM %d !!!!!!!!!!!", n);\r
+ }\r
}\r
}\r
}\r
- }\r
}\r
\r
-\r
bool cCardClientCCcam::GetCCamCw(unsigned char *cw, int s)\r
{\r
unsigned char msg[18];\r
return(true);\r
}\r
\r
-\r
int cCardClientCCcam::CCSelect(int sd, bool forRead, int s)\r
{\r
- if(sd>=0)\r
- {\r
+ if(sd>=0) {\r
fd_set fds;\r
FD_ZERO(&fds); FD_SET(sd,&fds);\r
struct timeval tv;\r
tv.tv_sec=4; tv.tv_usec=000;\r
int r=::select(sd+1,forRead ? &fds:0,forRead ? 0:&fds,0,&tv);\r
if(r>0) return 1;\r
- else if(r<0)\r
- {\r
- return 0;\r
+ else if(r<0) return 0;\r
+ else return 0;\r
}\r
- else\r
- {\r
- return 0;\r
- }\r
- }\r
return 0;\r
}\r
-\r
-\r
-int caid_count =1 ;\r
-int parse_ca_pmt ( unsigned char * buffer, unsigned int length)\r
-{\r
- unsigned short i, j;\r
- ca_pmt * pmt;\r
- descrambleservice_s service;\r
-\r
- memset(&service, 0, sizeof(descrambleservice_s));\r
-\r
- pmt = (ca_pmt *) malloc(sizeof(ca_pmt));\r
-\r
- pmt->ca_pmt_list_management = buffer[0];\r
- pmt->program_number = (buffer[1] << 8) | buffer[2];\r
- pmt->program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];\r
-\r
- printf("ca_pmt_list_management: %02x\n", pmt->ca_pmt_list_management);\r
- printf("prugram number: %04x\n", pmt->program_number);\r
- printf("program_info_length: %04x\n", pmt->program_info_length);\r
- switch (pmt->ca_pmt_list_management)\r
- {\r
- case 0x01: /* first */\r
- printf("first\n");\r
- break;\r
- case 0x03: /* only */\r
- printf("only\n");\r
- break;\r
-\r
- default:\r
- printf("unknown\n");\r
- break;\r
- }\r
-\r
- if (pmt->program_info_length != 0)\r
- {\r
- pmt->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info));\r
- pmt->program_info->ca_pmt_cmd_id = buffer[6];\r
- printf("ca_pmt_id: %04x\n", pmt->program_info->ca_pmt_cmd_id);\r
- pmt->program_info->descriptor = (ca_descriptor *) malloc(sizeof(ca_descriptor));\r
-\r
- for (i = 0; i < pmt->program_info_length - 1; i += pmt->program_info->descriptor->descriptor_length + 2)\r
- {\r
- pmt->program_info->descriptor->descriptor_length = buffer[i + 8];\r
- pmt->program_info->descriptor->ca_system_id = (buffer[i + 9] << 8) | buffer[i + 10];\r
- pmt->program_info->descriptor->ca_pid = ((buffer[i + 11] & 0x1F) << 8)| buffer[i + 12];\r
- printf("ca_descriptor_length %d\n",pmt->program_info->descriptor->descriptor_length);\r
- printf("ca_system_id: %04x\n", pmt->program_info->descriptor->ca_system_id);\r
- printf("ca_pid: %04x\n", pmt->program_info->descriptor->ca_pid);\r
-\r
- }\r
-\r
- free(pmt->program_info->descriptor);\r
- free(pmt->program_info);\r
- }\r
-\r
- pmt->es_info = (ca_pmt_es_info *) malloc(sizeof(ca_pmt_es_info));\r
-\r
- for (i = pmt->program_info_length + 6; i < length; i += pmt->es_info->es_info_length + 5)\r
- {\r
- if (service.numpids == MAX_PIDS)\r
- {\r
- break;\r
- }\r
-\r
- pmt->es_info->stream_type = buffer[i];\r
- pmt->es_info->elementary_pid = ((buffer[i + 1] & 0x1F) << 8) | buffer[i + 2];\r
- pmt->es_info->es_info_length = ((buffer[i + 3] & 0x0F) << 8) | buffer[i + 4];\r
-\r
- printf("stream_type: %02x\n", pmt->es_info->stream_type);\r
- printf("elementary_pid: %04x\n", pmt->es_info->elementary_pid);\r
- printf("es_info_length: %04x\n", pmt->es_info->es_info_length);\r
-\r
- service.pid[service.numpids++] = pmt->es_info->elementary_pid;\r
-\r
- if (pmt->es_info->es_info_length != 0)\r
- {\r
- pmt->es_info->program_info = (ca_pmt_program_info *) malloc(sizeof(ca_pmt_program_info));\r
-\r
- pmt->es_info->program_info->ca_pmt_cmd_id = buffer[i + 5];\r
- pmt->es_info->program_info->descriptor = (ca_descriptor *)malloc(sizeof(ca_descriptor));\r
-\r
- for (j = 0; j < pmt->es_info->es_info_length - 1; j += pmt->es_info->program_info->descriptor->descriptor_length + 2)\r
- {\r
- pmt->es_info->program_info->descriptor->descriptor_length = buffer[i + j + 7];\r
- pmt->es_info->program_info->descriptor->ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9];\r
- pmt->es_info->program_info->descriptor->ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11];\r
-\r
- printf("ca_system_id: %04x\n", pmt->es_info->program_info->descriptor->ca_system_id);\r
- printf("ca_pid: %04x\n", pmt->es_info->program_info->descriptor->ca_pid);\r
-\r
- if (service.caID != 0)\r
- {\r
- break;\r
- }\r
- }\r
-\r
- free(pmt->es_info->program_info->descriptor);\r
- free(pmt->es_info->program_info);\r
- }\r
- }\r
-\r
- service.sID = pmt->program_number;\r
-\r
- free(pmt->es_info);\r
- free(pmt);\r
-\r
- if ((service.numpids != 0) && (service.caID != 0))\r
- {\r
- service.onID = 0x0085;\r
-\r
- service.Unkwn = 0x0104;\r
-\r
- return 0; // return adddescrambleservicestruct(&service);\r
- }\r
- else\r
- {\r
- return -1;\r
- }\r
-}\r
-\r
-\r
-unsigned int parse_length_field (unsigned char * buffer)\r
-{\r
- unsigned char size_indicator = (buffer[0] >> 7) & 0x01;\r
- unsigned int length_value = 0;\r
-\r
- if (size_indicator == 0)\r
- {\r
- length_value = buffer[0] & 0x7F;\r
- }\r
-\r
- else if (size_indicator == 1)\r
- {\r
- unsigned char length_field_size = buffer[0] & 0x7F;\r
- unsigned int i;\r
-\r
- for (i = 0; i < length_field_size; i++)\r
- {\r
- length_value = (length_value << 8) | buffer[i + 1];\r
- }\r
- }\r
-\r
- return length_value;\r
-}\r
-\r
-\r
-unsigned char get_length_field_size (unsigned int length)\r
-{\r
- if (length < 0x80)\r
- {\r
- return 0x01;\r
- }\r
-\r
- if (length < 0x100)\r
- {\r
- return 0x02;\r
- }\r
-\r
- if (length < 0x10000)\r
- {\r
- return 0x03;\r
- }\r
-\r
- if (length < 0x1000000)\r
- {\r
- return 0x04;\r
- }\r
-\r
- else\r
- {\r
- return 0x05;\r
- }\r
-}\r