Changeset 34123


Ignore:
Timestamp:
2012-11-08T17:04:50+01:00 (5 years ago)
Author:
mirko
Message:

AA: asterisk: backport: upgrade lantiq channel driver to latest version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/packages_12.09/net/asterisk-1.8.x/src-lantiq/channels/chan_lantiq.c

    r32681 r34123  
    106106 
    107107static struct lantiq_pvt { 
    108         struct ast_channel *owner;         /* Channel we belong to, possibly NULL  */ 
    109         int port_id;                       /* Port number of this object, 0..n     */ 
     108        struct ast_channel *owner;         /* Channel we belong to, possibly NULL   */ 
     109        int port_id;                       /* Port number of this object, 0..n      */ 
    110110        int channel_state; 
    111         char context[AST_MAX_CONTEXT];     /* this port's dialplan context         */ 
    112         char ext[AST_MAX_EXTENSION+1];     /* the extension this port is connecting*/ 
    113         int dial_timer;                    /* timer handle for autodial timeout    */ 
    114         char dtmfbuf[AST_MAX_EXTENSION+1]; /* buffer holding dialed digits         */ 
    115         int dtmfbuf_len;                   /* lenght of dtmfbuf                    */ 
    116         int rtp_timestamp;                 /* timestamp for RTP packets            */ 
    117         uint16_t rtp_seqno;                /* Sequence nr for RTP packets          */ 
     111        char context[AST_MAX_CONTEXT];     /* this port's dialplan context          */ 
     112        char ext[AST_MAX_EXTENSION+1];     /* the extension this port is connecting */ 
     113        int dial_timer;                    /* timer handle for autodial timeout     */ 
     114        char dtmfbuf[AST_MAX_EXTENSION+1]; /* buffer holding dialed digits          */ 
     115        int dtmfbuf_len;                   /* lenght of dtmfbuf                     */ 
     116        int rtp_timestamp;                 /* timestamp for RTP packets             */ 
     117        uint16_t rtp_seqno;                /* Sequence nr for RTP packets           */ 
     118        uint32_t call_setup_start;         /* Start of dialling in ms               */ 
     119        uint32_t call_setup_delay;         /* time between ^ and 1st ring in ms     */ 
     120        uint16_t jb_size;                  /* Jitter buffer size                    */ 
     121        uint32_t jb_underflow;             /* Jitter buffer injected samples        */ 
     122        uint32_t jb_overflow;              /* Jitter buffer dropped samples         */ 
     123        uint16_t jb_delay;                 /* Jitter buffer: playout delay          */ 
     124        uint16_t jb_invalid;               /* Jitter buffer: Nr. of invalid packets */ 
     125 
    118126} *iflist = NULL; 
    119127 
     
    135143static int ast_lantiq_fixup(struct ast_channel *old, struct ast_channel *new); 
    136144static struct ast_channel *ast_lantiq_requester(const char *type, format_t format, const struct ast_channel *requestor, void *data, int *cause); 
     145static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *args, char *buf, size_t buflen); 
     146static void lantiq_jb_get_stats(int c); 
    137147 
    138148static const struct ast_channel_tech lantiq_tech = { 
     
    150160        .indicate = ast_lantiq_indicate, 
    151161        .fixup = ast_lantiq_fixup, 
    152         .requester = ast_lantiq_requester 
     162        .requester = ast_lantiq_requester, 
     163        .func_channel_read = acf_channel_read 
    153164}; 
    154165 
     
    194205} rtp_header_t; 
    195206 
     207static uint32_t now(void) { 
     208        struct timespec ts; 
     209        clock_gettime(CLOCK_MONOTONIC, &ts); 
     210 
     211        uint64_t tmp = ts.tv_sec*1000 + (ts.tv_nsec/1000000); 
     212        return (uint32_t) tmp; 
     213} 
     214 
    196215static int lantiq_dev_open(const char *dev_path, const int32_t ch_num) 
    197216{ 
     
    202221} 
    203222 
    204 static void lantiq_ring(int c, int r) 
     223static void lantiq_ring(int c, int r, const char *cid) 
    205224{ 
    206225        uint8_t status; 
    207226 
    208227        if (r) { 
    209                 status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_START, 0); 
     228                if (!cid) { 
     229                        status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_START, 0); 
     230                } else { 
     231                        IFX_TAPI_CID_MSG_t msg; 
     232                        IFX_TAPI_CID_MSG_STRING_t cid_el; 
     233 
     234                        memset(&msg, 0, sizeof(msg)); 
     235                        memset(&cid_el, 0, sizeof(cid_el)); 
     236                         
     237                        cid_el.elementType = IFX_TAPI_CID_ST_CLI; 
     238                        cid_el.len = strlen(cid); 
     239                        strncpy((char*)cid_el.element, cid, (size_t)cid_el.len); 
     240 
     241                        msg.txMode = IFX_TAPI_CID_HM_ONHOOK; 
     242                        msg.messageType = IFX_TAPI_CID_MT_CSUP; 
     243                        msg.message = (IFX_TAPI_CID_MSG_ELEMENT_t *)&cid_el; 
     244                        msg.nMsgElements = 1; 
     245 
     246                        status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_CID_TX_SEQ_START, (IFX_int32_t) &msg); 
     247                } 
    210248        } else { 
    211249                status = (uint8_t) ioctl(dev_ctx.ch_fd[c], IFX_TAPI_RING_STOP, 0); 
     
    380418                case AST_CONTROL_RINGING: 
    381419                        { 
     420                                pvt->call_setup_delay = now() - pvt->call_setup_start; 
    382421                                lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_RINGING_CODE); 
    383422                                return 0; 
     
    420459        if (pvt->channel_state == ONHOOK) { 
    421460                ast_log(LOG_DEBUG, "port %i is ringing\n", pvt->port_id); 
    422                 lantiq_ring(pvt->port_id, 1); 
     461 
     462                char *cid = ast->connected.id.number.valid ? ast->connected.id.number.str : NULL; 
     463                ast_log(LOG_DEBUG, "port %i CID: %s\n", pvt->port_id, cid ? cid : "none"); 
     464 
     465                lantiq_ring(pvt->port_id, 1, cid); 
    423466                pvt->channel_state = RINGING; 
    424467 
     
    430473                ast_queue_control(ast, AST_CONTROL_BUSY); 
    431474        } 
    432                  
     475 
    433476        ast_mutex_unlock(&iflock); 
    434477 
     
    452495                case RINGING: 
    453496                case ONHOOK:  
    454                         lantiq_ring(pvt->port_id, 0); 
     497                        lantiq_ring(pvt->port_id, 0, NULL); 
    455498                        pvt->channel_state = ONHOOK; 
    456499                        break; 
     
    460503                        lantiq_play_tone(pvt->port_id, TAPI_TONE_LOCALE_BUSY_CODE); 
    461504        } 
     505 
     506        lantiq_jb_get_stats(pvt->port_id); 
    462507 
    463508        ast_setstate(ast, AST_STATE_DOWN); 
     
    539584} 
    540585 
     586static int acf_channel_read(struct ast_channel *chan, const char *funcname, char *args, char *buf, size_t buflen) 
     587{ 
     588        struct lantiq_pvt *pvt; 
     589        int res = 0; 
     590 
     591        if (!chan || chan->tech != &lantiq_tech) { 
     592                ast_log(LOG_ERROR, "This function requires a valid Lantiq TAPI channel\n"); 
     593                return -1; 
     594        } 
     595 
     596        ast_mutex_lock(&iflock); 
     597 
     598        pvt = (struct lantiq_pvt*) chan->tech_pvt; 
     599 
     600        if (!strcasecmp(args, "csd")) { 
     601                snprintf(buf, buflen, "%lu", (unsigned long int) pvt->call_setup_delay); 
     602        } else if (!strcasecmp(args, "jitter_stats")){ 
     603                lantiq_jb_get_stats(pvt->port_id); 
     604                snprintf(buf, buflen, "jbBufSize=%u,jbUnderflow=%u,jbOverflow=%u,jbDelay=%u,jbInvalid=%u", 
     605                                (uint32_t) pvt->jb_size, 
     606                                (uint32_t) pvt->jb_underflow, 
     607                                (uint32_t) pvt->jb_overflow, 
     608                                (uint32_t) pvt->jb_delay, 
     609                                (uint32_t) pvt->jb_invalid); 
     610        } else { 
     611                res = -1; 
     612        } 
     613 
     614        ast_mutex_unlock(&iflock); 
     615 
     616        return res; 
     617} 
     618 
     619 
    541620static struct ast_frame * ast_lantiq_exception(struct ast_channel *ast) 
    542621{ 
     
    544623        return NULL; 
    545624} 
     625 
     626static void lantiq_jb_get_stats(int c) { 
     627        struct lantiq_pvt *pvt = &iflist[c]; 
     628 
     629        IFX_TAPI_JB_STATISTICS_t param; 
     630        memset (&param, 0, sizeof (param)); 
     631        if (ioctl (dev_ctx.ch_fd[c], IFX_TAPI_JB_STATISTICS_GET, (IFX_int32_t) &param) != IFX_SUCCESS) { 
     632                ast_debug(1, "Error getting jitter buffer  stats.\n"); 
     633        } else { 
     634#if !defined (TAPI_VERSION3) && defined (TAPI_VERSION4) 
     635                ast_debug(1, "Jitter buffer stats:  dev=%u, ch=%u, nType=%u, nBufSize=%u, nIsUnderflow=%u, nDsOverflow=%u, nPODelay=%u, nInvalid=%u",  
     636                                (uint32_t) param.dev, 
     637                                (uint32_t) param.ch, 
     638#else 
     639                ast_debug(1, "Jitter buffer stats:  nType=%u, nBufSize=%u, nIsUnderflow=%u, nDsOverflow=%u, nPODelay=%u, nInvalid=%u",  
     640#endif 
     641                                (uint32_t) param.nType, 
     642                                (uint32_t) param.nBufSize, 
     643                                (uint32_t) param.nIsUnderflow, 
     644                                (uint32_t) param.nDsOverflow, 
     645                                (uint32_t) param.nPODelay, 
     646                                (uint32_t) param.nInvalid); 
     647                 
     648                pvt->jb_size = param.nBufSize; 
     649                pvt->jb_underflow = param.nIsUnderflow; 
     650                pvt->jb_overflow = param.nDsOverflow; 
     651                pvt->jb_invalid = param.nInvalid; 
     652                pvt->jb_delay = param.nPODelay; 
     653        } 
     654} 
     655 
    546656 
    547657static int lantiq_standby(int c) 
     
    567677static int lantiq_end_dialing(int c) 
    568678{ 
    569         ast_log(LOG_DEBUG, "TODO - DEBUG MSG"); 
     679        ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n"); 
    570680        struct lantiq_pvt *pvt = &iflist[c]; 
    571681 
     
    584694static int lantiq_end_call(int c) 
    585695{ 
    586         ast_log(LOG_DEBUG, "TODO - DEBUG MSG"); 
     696        ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n"); 
    587697 
    588698        struct lantiq_pvt *pvt = &iflist[c]; 
    589699         
    590700        if(pvt->owner) { 
     701                lantiq_jb_get_stats(c); 
    591702                ast_queue_hangup(pvt->owner); 
    592703        } 
     
    597708static struct ast_channel * lantiq_channel(int state, int c, char *ext, char *ctx) 
    598709{ 
    599         ast_log(LOG_DEBUG, "TODO - DEBUG MSG"); 
     710        ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n"); 
    600711 
    601712        struct ast_channel *chan = NULL; 
     
    671782        frame.data.ptr = buf + RTP_HEADER_LEN; 
    672783 
    673         ast_mutex_lock(&iflock); 
    674784        struct lantiq_pvt *pvt = (struct lantiq_pvt *) &iflist[c]; 
    675785        if (pvt->owner && (pvt->owner->_state == AST_STATE_UP)) { 
     
    679789                } 
    680790        } 
    681  
    682         ast_mutex_unlock(&iflock); 
    683791 
    684792/*      ast_debug(1, "lantiq_dev_data_handler(): size: %i version: %i padding: %i extension: %i csrc_count: %i \n" 
     
    700808static int accept_call(int c) 
    701809{  
    702         ast_log(LOG_DEBUG, "TODO - DEBUG MSG"); 
     810        ast_log(LOG_DEBUG, "TODO - DEBUG MSG\n"); 
    703811 
    704812        struct lantiq_pvt *pvt = &iflist[c]; 
     
    709817                switch (chan->_state) { 
    710818                        case AST_STATE_RINGING: 
     819                                lantiq_play_tone(c, TAPI_TONE_LOCALE_NONE); 
    711820                                ast_queue_control(pvt->owner, AST_CONTROL_ANSWER); 
    712821                                pvt->channel_state = INCALL; 
     
    727836 
    728837        int ret = -1; 
    729         if (state) { 
     838        if (state) { /* going onhook */ 
    730839                switch (iflist[c].channel_state) { 
    731840                        case OFFHOOK:  
     
    745854                } 
    746855                iflist[c].channel_state = ONHOOK; 
    747         } else { 
     856        } else { /* going offhook */ 
    748857                if (ioctl(dev_ctx.ch_fd[c], IFX_TAPI_LINE_FEED_SET, IFX_TAPI_LINE_FEED_ACTIVE)) { 
    749858                        ast_log(LOG_ERROR, "IFX_TAPI_LINE_FEED_SET ioctl failed\n"); 
     
    800909                ast_verbose(VERBOSE_PREFIX_3 " extension exists, starting PBX %s\n", pvt->ext); 
    801910 
    802                 chan = lantiq_channel(AST_STATE_UP, 1, pvt->ext+1, pvt->context); 
     911                chan = lantiq_channel(AST_STATE_UP, pvt->port_id, pvt->ext+1, pvt->context); 
    803912                chan->tech_pvt = pvt; 
    804913                pvt->owner = chan; 
     
    807916                ast_setstate(chan, AST_STATE_RING); 
    808917                pvt->channel_state = INCALL; 
     918 
     919                pvt->call_setup_start = now(); 
    809920 
    810921                if (ast_pbx_start(chan)) { 
     
    11051216                pvt->dtmfbuf[0] = '\0'; 
    11061217                pvt->dtmfbuf_len = 0; 
     1218                pvt->call_setup_start = 0; 
     1219                pvt->call_setup_delay = 0; 
     1220                pvt->jb_size = 0; 
     1221                pvt->jb_underflow = 0; 
     1222                pvt->jb_overflow = 0; 
     1223                pvt->jb_delay = 0; 
     1224                pvt->jb_invalid = 0; 
    11071225        } else { 
    11081226                ast_log(LOG_ERROR, "unable to clear pvt structure\n"); 
     
    13281446                        } 
    13291447                } else if (!strcasecmp(v->name, "calleridtype")) { 
     1448                        ast_log(LOG_DEBUG, "Setting CID type to %s.\n", v->value); 
    13301449                        if (!strcasecmp(v->value, "telecordia")) { 
    13311450                                cid_type = IFX_TAPI_CID_STD_TELCORDIA; 
Note: See TracChangeset for help on using the changeset viewer.