Changeset 10652
- Timestamp:
- 04/24/15 11:16:16 (9 years ago)
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/README.dvbapi_protocol
r10389 r10652 183 183 9F 80 3f 04 83 02 00 <demux index> 184 184 If <demux index> is 0xff, then it is parsed as a wildcard and all demuxers associated with the connection are stopped. 185 186 187 In protocol version 2 the new packet with ECM info data was introduced: 188 189 -= DVBAPI_ECM_INFO =- 190 ----------------------------------------------------------------------- 191 type/size description 192 ----------------------------------------------------------------------- 193 uint32_t operation code -> DVBAPI_ECM_INFO 194 uint8_t adapter index 195 uint16_t Service ID 196 uint16_t CAID 197 uint16_t PID 198 uint32_t Provider ID 199 uint32_t ECM time (ms) 200 uint8_t size of followed string (255 bytes max) 201 string reader name (string length should be max 255 bytes) 202 uint8_t size of followed string (255 bytes max) 203 string from - source name (string length should be max 255 bytes) 204 uint8_t size of followed string (255 bytes max) 205 string protocol name (string length should be max 255 bytes) 206 uint8_t hops (cccam & gbox; set to 0 otherwise) -
trunk/module-dvbapi.c
r10647 r10652 366 366 } 367 367 368 int32_t dvbapi_net_send(uint32_t request, int32_t socket_fd, int32_t demux_index, uint32_t filter_number, unsigned char *data) 369 { 370 unsigned char packet[262]; //maximum possible packet size 368 void dvbapi_net_add_str(unsigned char *packet, int *size, const char *str) 369 { 370 unsigned char *str_len = &packet[*size]; //string length 371 *size += 1; 372 373 *str_len = snprintf((char *) &packet[*size], DVBAPI_MAX_PACKET_SIZE - *size, "%s", str); 374 *size += *str_len; 375 } 376 377 int32_t dvbapi_net_send(uint32_t request, int32_t socket_fd, int32_t demux_index, uint32_t filter_number, unsigned char *data, struct s_client *client, ECM_REQUEST *er) 378 { 379 unsigned char packet[DVBAPI_MAX_PACKET_SIZE]; //maximum possible packet size 371 380 int32_t size = 0; 372 381 … … 406 415 *info_len = snprintf((char *) &packet[size], sizeof(packet) - size, "OSCam v%s, build r%s (%s)", CS_VERSION, CS_SVN_VERSION, CS_TARGET); 407 416 size += *info_len; 417 break; 418 } 419 case DVBAPI_ECM_INFO: 420 { 421 if (er->rc >= E_NOTFOUND) 422 return 0; 423 424 int8_t hops = 0; 425 426 uint16_t sid = htons(er->srvid); //service ID (program number) 427 memcpy(&packet[size], &sid, 2); 428 size += 2; 429 430 uint16_t caid = htons(er->caid); //CAID 431 memcpy(&packet[size], &caid, 2); 432 size += 2; 433 434 uint16_t pid = htons(er->pid); //PID 435 memcpy(&packet[size], &pid, 2); 436 size += 2; 437 438 uint32_t prid = htonl(er->prid); //Provider ID 439 memcpy(&packet[size], &prid, 4); 440 size += 4; 441 442 uint32_t ecmtime = htonl(client->cwlastresptime); //ECM time 443 memcpy(&packet[size], &ecmtime, 4); 444 size += 4; 445 446 switch (er->rc) 447 { 448 case E_FOUND: 449 if (er->selected_reader) 450 { 451 dvbapi_net_add_str(packet, &size, er->selected_reader->label); //reader 452 if (is_network_reader(er->selected_reader)) 453 dvbapi_net_add_str(packet, &size, er->selected_reader->device); //from 454 else 455 dvbapi_net_add_str(packet, &size, "local"); //from 456 dvbapi_net_add_str(packet, &size, reader_get_type_desc(er->selected_reader, 1)); //protocol 457 hops = er->selected_reader->currenthops; 458 } 459 break; 460 461 case E_CACHE1: 462 dvbapi_net_add_str(packet, &size, "Cache"); //reader 463 dvbapi_net_add_str(packet, &size, "cache1"); //from 464 dvbapi_net_add_str(packet, &size, "none"); //protocol 465 break; 466 467 case E_CACHE2: 468 dvbapi_net_add_str(packet, &size, "Cache"); //reader 469 dvbapi_net_add_str(packet, &size, "cache2"); //from 470 dvbapi_net_add_str(packet, &size, "none"); //protocol 471 break; 472 473 case E_CACHEEX: 474 dvbapi_net_add_str(packet, &size, "Cache"); //reader 475 dvbapi_net_add_str(packet, &size, "cache3"); //from 476 dvbapi_net_add_str(packet, &size, "none"); //protocol 477 break; 478 } 479 480 packet[size++] = hops; //hops 481 408 482 break; 409 483 } … … 577 651 memcpy(sFP2.filter.mask, mask, 16); 578 652 if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) 579 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_id].socket_fd, demux_id, n, (unsigned char *) &sFP2 );653 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_id].socket_fd, demux_id, n, (unsigned char *) &sFP2, NULL, NULL); 580 654 else 581 655 ret = dvbapi_ioctl(demux[demux_id].demux_fd[n].fd, DMX_SET_FILTER, &sFP2); … … 860 934 case DVBAPI_3: 861 935 if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) 862 retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL );936 retfilter = dvbapi_net_send(DVBAPI_DMX_STOP, demux[demux_index].socket_fd, demux_index, num, NULL, NULL, NULL); 863 937 else 864 938 retfilter = dvbapi_ioctl(fd, DMX_STOP, NULL); … … 1391 1465 1392 1466 if(cfg.dvbapi_boxtype == BOXTYPE_PC || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) 1393 dvbapi_net_send(DVBAPI_CA_SET_PID, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_pid2 );1467 dvbapi_net_send(DVBAPI_CA_SET_PID, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_pid2, NULL, NULL); 1394 1468 else 1395 1469 { … … 4057 4131 4058 4132 // as a response we are sending our info to the client: 4059 dvbapi_net_send(DVBAPI_SERVER_INFO, connfd, -1, -1, NULL );4133 dvbapi_net_send(DVBAPI_SERVER_INFO, connfd, -1, -1, NULL, NULL, NULL); 4060 4134 break; 4061 4135 } … … 4212 4286 4213 4287 if(cfg.dvbapi_boxtype == BOXTYPE_PC || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) 4214 dvbapi_net_send(DVBAPI_CA_SET_DESCR, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_descr );4288 dvbapi_net_send(DVBAPI_CA_SET_DESCR, demux[demux_id].socket_fd, demux_id, -1 /*unused*/, (unsigned char *) &ca_descr, NULL, NULL); 4215 4289 else 4216 4290 { … … 4521 4595 4522 4596 FILE *ecmtxt = NULL; 4523 if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX) 4597 if (cfg.dvbapi_listenport && client_proto_version >= 2) 4598 dvbapi_net_send(DVBAPI_ECM_INFO, demux[i].socket_fd, i, 0, NULL, client, er); 4599 else if (!cfg.dvbapi_listenport && cfg.dvbapi_boxtype != BOXTYPE_PC_NODMX) 4524 4600 ecmtxt = fopen(ECMINFO_FILE, "w"); 4525 4601 if(ecmtxt != NULL && er->rc < E_NOTFOUND) … … 4771 4847 memcpy(sFP2.filter.mask, mask, 16); 4772 4848 if (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) 4773 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_index].socket_fd, demux_index, num, (unsigned char *) &sFP2 );4849 ret = dvbapi_net_send(DVBAPI_DMX_SET_FILTER, demux[demux_index].socket_fd, demux_index, num, (unsigned char *) &sFP2, NULL, NULL); 4774 4850 else 4775 4851 ret = dvbapi_ioctl(fd, DMX_SET_FILTER, &sFP2); -
trunk/module-dvbapi.h
r10622 r10652 50 50 51 51 //constants used int socket communication: 52 #define DVBAPI_PROTOCOL_VERSION 152 #define DVBAPI_PROTOCOL_VERSION 2 53 53 54 54 #define DVBAPI_CA_SET_PID 0x40086f87 … … 63 63 #define DVBAPI_CLIENT_INFO 0xFFFF0001 64 64 #define DVBAPI_SERVER_INFO 0xFFFF0002 65 #define DVBAPI_ECM_INFO 0xFFFF0003 66 67 #define DVBAPI_MAX_PACKET_SIZE 262 //maximum possible packet size 65 68 66 69 struct box_devices
Note:
See TracChangeset
for help on using the changeset viewer.