Skip to content
This repository has been archived by the owner on Apr 14, 2024. It is now read-only.

Commit

Permalink
DVBAPI (Experimental!)
Browse files Browse the repository at this point in the history
- Added filterdata check: now we are sure filter data we get from the box is matching with the filter that we setup to receive it!


git-svn-id: http://www.streamboard.tv/svn/oscam/trunk@10959 4b0bc96b-bc66-0410-9d44-ebda105a78c1
  • Loading branch information
theparasol committed Aug 23, 2015
1 parent d8ff405 commit a6b2c19
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 2 deletions.
60 changes: 58 additions & 2 deletions module-dvbapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,8 @@ int32_t dvbapi_set_filter(int32_t demux_id, int32_t api, uint16_t pid, uint16_t
else
ret = dvbapi_ioctl(demux[demux_id].demux_fd[n].fd, DMX_SET_FILTER, &sFP2);
}
memcpy(demux[demux_id].demux_fd[n].filter, sFP2.filter.filter, 16);
memcpy(demux[demux_id].demux_fd[n].mask, sFP2.filter.mask, 16);
break;

case DVBAPI_1:
Expand All @@ -716,14 +718,20 @@ int32_t dvbapi_set_filter(int32_t demux_id, int32_t api, uint16_t pid, uint16_t
sFP1.flags = DMX_IMMEDIATE_START;
memcpy(sFP1.filter.filter, filt, 16);
memcpy(sFP1.filter.mask, mask, 16);
memcpy(demux[demux_id].demux_fd[n].filter, sFP1.filter.filter, 16);
memcpy(demux[demux_id].demux_fd[n].mask, sFP1.filter.mask, 16);
ret = dvbapi_ioctl(demux[demux_id].demux_fd[n].fd, DMX_SET_FILTER1, &sFP1);

break;
#if defined(WITH_STAPI) || defined(WITH_STAPI5)
case STAPI:
ret = stapi_set_filter(demux_id, pid, filt, mask, n, demux[demux_id].pmt_file);
if(ret != 0)
{ demux[demux_id].demux_fd[n].fd = ret; }
{
demux[demux_id].demux_fd[n].fd = ret;
memcpy(demux[demux_id].demux_fd[n].filter, filt, 16);
memcpy(demux[demux_id].demux_fd[n].mask, mask, 16);
}
else
{ ret = -1; } // error setting filter!
break;
Expand All @@ -732,7 +740,11 @@ int32_t dvbapi_set_filter(int32_t demux_id, int32_t api, uint16_t pid, uint16_t
case COOLAPI:
demux[demux_id].demux_fd[n].fd = coolapi_open_device(demux[demux_id].demux_index, demux_id);
if(demux[demux_id].demux_fd[n].fd > 0)
{ ret = coolapi_set_filter(demux[demux_id].demux_fd[n].fd, n, pid, filt, mask, type); }
{
ret = coolapi_set_filter(demux[demux_id].demux_fd[n].fd, n, pid, filt, mask, type);
memcpy(demux[demux_id].demux_fd[n].filter, filt, 16);
memcpy(demux[demux_id].demux_fd[n].mask, mask, 16);
}
break;
#endif
default:
Expand Down Expand Up @@ -2143,6 +2155,11 @@ void dvbapi_resort_ecmpids(int32_t demux_index)
{
demux[demux_index].ECMpids[n].status = 0;
demux[demux_index].ECMpids[n].checked = 0;
demux[demux_index].ECMpids[n].irdeto_curindex = 0xFE;
demux[demux_index].ECMpids[n].irdeto_maxindex = 0;
demux[demux_index].ECMpids[n].irdeto_cycle = 0xFE;
demux[demux_index].ECMpids[n].tries = 0xFE;
demux[demux_index].ECMpids[n].table = 0;
}

demux[demux_index].max_status = 0;
Expand Down Expand Up @@ -3809,6 +3826,15 @@ void *dvbapi_event_thread(void *cli)
void dvbapi_process_input(int32_t demux_id, int32_t filter_num, uchar *buffer, int32_t len)
{
int32_t pid = demux[demux_id].demux_fd[filter_num].pidindex;
if(!USE_OPENXCAS)
{
int32_t filt_match = filtermatch(buffer, filter_num, demux_id, len);
if(!filt_match)
{
cs_log_dbg(D_DVBAPI,"Receiver returned data that was not matching to the filter -> delivered filter data discarded!");
return;
}
}
struct s_ecmpids *curpid = NULL;
if(pid != -1)
{
Expand Down Expand Up @@ -5594,6 +5620,8 @@ int32_t dvbapi_activate_section_filter(int32_t demux_index, int32_t num, int32_t
else
ret = dvbapi_ioctl(fd, DMX_SET_FILTER, &sFP2);
}
memcpy(demux[demux_index].demux_fd[num].filter, sFP2.filter.filter, 16);
memcpy(demux[demux_index].demux_fd[num].mask, sFP2.filter.mask, 16);
break;
}

Expand All @@ -5606,12 +5634,16 @@ int32_t dvbapi_activate_section_filter(int32_t demux_index, int32_t num, int32_t
sFP1.flags = DMX_IMMEDIATE_START;
memcpy(sFP1.filter.filter, filter, 16);
memcpy(sFP1.filter.mask, mask, 16);
memcpy(demux[demux_index].demux_fd[num].filter, sFP1.filter.filter, 16);
memcpy(demux[demux_index].demux_fd[num].mask, sFP1.filter.mask, 16);
ret = dvbapi_ioctl(fd, DMX_SET_FILTER1, &sFP1);
break;
}
#if defined(WITH_STAPI) || defined(WITH_STAPI5)
case STAPI:
{
memcpy(demux[demux_index].demux_fd[num].filter, filter, 16);
memcpy(demux[demux_index].demux_fd[num].mask, mask, 16);
ret = stapi_activate_section_filter(fd, filter, mask);
break;
}
Expand Down Expand Up @@ -6033,6 +6065,30 @@ void rotate_emmfilter(int32_t demux_id)
}
}

int32_t filtermatch(uchar *buffer, int32_t filter_num, int32_t demux_id, int32_t len)
{
int32_t i, k, match;
uint8_t flt, mask;
match = 1;
for(i = 0, k = 0; i < 16 && k < len && len > 3 && match; i++, k++)
{
mask = demux[demux_id].demux_fd[filter_num].mask[i];
if(k == 1) //skip len bytes
{
k += 2;
}
if(!mask)
{
continue;
}
flt = (demux[demux_id].demux_fd[filter_num].filter[i]&mask);
cs_log_dbg(D_DVBAPI,"Demuxer %d filter%d[%d] = %02X, filter mask[%d] = %02X, flt&mask = %02X , buffer[%d] = %02X, buffer[%d] & mask = %02X ****", demux_id, filter_num+1, i,
demux[demux_id].demux_fd[filter_num].filter[i], i, mask, flt&mask, k, buffer[k], k, buffer[k] & mask);
match = (flt == (buffer[k] & mask));
}
return (match && i == 16); // 0 = delivered data does not match with filter, 1 = delivered data matches with filter
}

uint16_t dvbapi_get_client_proto_version(void)
{
return client_proto_version;
Expand Down
3 changes: 3 additions & 0 deletions module-dvbapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,8 @@ typedef struct filter_s
uint32_t provid;
uint16_t type;
int32_t count;
uchar filter[16];
uchar mask[16];
uchar ecmd5[CS_ECMSTORESIZE]; // last requested ecm md5
#if defined(WITH_STAPI) || defined(WITH_STAPI5)
int32_t NumSlots;
Expand Down Expand Up @@ -304,6 +306,7 @@ void disable_unused_streampids(int16_t demux_id);
int8_t is_ca_used(uint8_t cadevice, int32_t pid);
const char *dvbapi_get_client_name(void);
void rotate_emmfilter(int32_t demux_id);
int32_t filtermatch(uchar *buffer, int32_t filter_num, int32_t demux_id, int32_t len);
uint16_t dvbapi_get_client_proto_version(void);
void delayer(ECM_REQUEST *er, uint32_t delay);
void check_add_emmpid(int32_t demux_index, uchar *filter, int32_t l, int32_t emmtype);
Expand Down

0 comments on commit a6b2c19

Please sign in to comment.