Ignore:
Timestamp:
Oct 31, 2015, 3:06:39 PM (4 years ago)
Author:
theparasol
Message:

DVBAPI:

  • Some rework on ca pmt parsing & connection handling
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-dvbapi.c

    r11066 r11067  
    47984798                        uint32_t pmtlen = 0, chunks_processed = 0;
    47994799
    4800                         int tries = 100;
     4800                        int8_t tries = 1;
    48014801                        do {
     4802                            if(tries > 1)
     4803                            {
     4804                                cs_sleepms(50);
     4805                            }
     4806                            cs_log_dbg(D_DVBAPI, "%s to read from connection fd %d try %d", ((chunks_processed == 0 && pmtlen == 0) ? "Trying":"Continue"), connfd , tries);
    48024807                            len = cs_recv(connfd, mbuf + pmtlen, sizeof(mbuf) - pmtlen, MSG_DONTWAIT);
    48034808                            if (len > 0)
    48044809                                pmtlen += len;
    4805                             if ((cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX) &&
    4806                                 (len == 0 || (len == -1 && (errno != EINTR && errno != EAGAIN))))
     4810                            if (len == -1 && (errno != EINTR && errno != EAGAIN))
    48074811                            {
    48084812                                //client disconnects, stop all assigned decoding
    48094813                                cs_log_dbg(D_DVBAPI, "Socket %d reported connection close", connfd);
    48104814                                int active_conn = 0; //other active connections counter
     4815                               
    48114816                                for (j = 0; j < MAX_DEMUX; j++)
    48124817                                {
     
    48224827                                connfd = -1;
    48234828                                add_to_poll = 0;
    4824                                 if (!active_conn) //last connection closed
     4829                                if (!active_conn && (cfg.dvbapi_listenport || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX)) //last connection closed
    48254830                                {
    48264831                                    client_proto_version = 0;
     
    48944899                                {
    48954900                                    chunks_processed++;
     4901                                    tries = 1;
    48964902                                    if ((opcode & 0xFFFFF000) == DVBAPI_AOT_CA)
    48974903                                    {
     
    49444950                                }
    49454951                            }
    4946                             if (len <= 0) {
    4947                                 if (pmtlen > 0 || chunks_processed > 0) //all data read
    4948                                     break;
    4949                                 else {          //wait for data become available and try again
    4950 
    4951                                     // remove from unassoc_fd if the socket fd is invalid
    4952                                     if (errno == EBADF)
    4953                                         for (j = 0; j < MAX_DEMUX; j++)
    4954                                             if (unassoc_fd[j] == connfd)
    4955                                                 unassoc_fd[j] = 0;
    4956                                     cs_sleepms(20);
    4957                                     continue;
    4958                                 }
     4952                            //cs_log_dbg(D_DVBAPI, "len = %d, pmtlen = %d, chunks_processed = %d", len, pmtlen, chunks_processed);
     4953                            if(len == -1 && pmtlen == 0 && chunks_processed > 0) // did we receive and process complete pmt already?
     4954                            {
     4955                                cs_log_dbg(D_DVBAPI, "Seems we received and parsed all PMT objects!");
     4956                                break;
    49594957                            }
    4960                         } while (pmtlen < sizeof(mbuf) && tries--);
     4958                            tries++;
     4959                        } while (pmtlen < sizeof(mbuf) && tries < 10); //wait for data become available and try again
    49614960
    49624961                        // if the connection is new and we read no PMT data, then add it to the poll,
Note: See TracChangeset for help on using the changeset viewer.