Navigation



Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • freeDiameter/p_psm.c

    r20 r29  
    5555        #define case_str( _val )\
    5656                case _val : return #_val
     57                case_str(FDEVP_DUMP_ALL);
    5758                case_str(FDEVP_TERMINATE);
    58                 case_str(FDEVP_DUMP_ALL);
    59                 case_str(FDEVP_MSG_INCOMING);
     59                case_str(FDEVP_CNX_MSG_RECV);
     60                case_str(FDEVP_CNX_ERROR);
     61                case_str(FDEVP_CNX_EP_CHANGE);
     62                case_str(FDEVP_CNX_INCOMING);
    6063                case_str(FDEVP_PSM_TIMEOUT);
    6164               
     
    125128}
    126129
    127 /* Wait for the next event in the PSM, or timeout */
    128 static int psm_ev_timedget(struct fd_peer * peer, int *code, void ** data)
    129 {
    130         struct fd_event * ev;
    131         int ret = 0;
    132        
    133         TRACE_ENTRY("%p %p %p", peer, code, data);
    134        
    135         ret = fd_fifo_timedget(peer->p_events, &ev, &peer->p_psm_timer);
    136         if (ret == ETIMEDOUT) {
    137                 *code = FDEVP_PSM_TIMEOUT;
    138                 *data = NULL;
    139         } else {
    140                 CHECK_FCT( ret );
    141                 *code = ev->code;
    142                 *data = ev->data;
    143                 free(ev);
    144         }
    145        
    146         return 0;
    147 }
    148 
    149130/* The state machine thread (controler) */
    150131static void * p_psm_th( void * arg )
     
    153134        int created_started = started;
    154135        int event;
     136        size_t ev_sz;
    155137        void * ev_data;
    156138       
     
    181163psm_loop:
    182164        /* Get next event */
    183         CHECK_FCT_DO( psm_ev_timedget(peer, &event, &ev_data), goto psm_end );
    184         TRACE_DEBUG(FULL, "'%s'\t<-- '%s'\t(%p)\t'%s'",
     165        CHECK_FCT_DO( fd_event_timedget(peer->p_events, &peer->p_psm_timer, FDEVP_PSM_TIMEOUT, &event, &ev_sz, &ev_data), goto psm_end );
     166        TRACE_DEBUG(FULL, "'%s'\t<-- '%s'\t(%p,%zd)\t'%s'",
    185167                        STATE_STR(peer->p_hdr.info.pi_state),
    186                         fd_pev_str(event), ev_data,
     168                        fd_pev_str(event), ev_data, ev_sz,
    187169                        peer->p_hdr.info.pi_diamid);
    188170
     
    227209        }
    228210       
     211        /* A new connection was established and CER containing this peer id was received */
     212        if (event == FDEVP_CNX_INCOMING) {
     213                struct cnx_incoming * params = ev_data;
     214                ASSERT(params);
     215               
     216                switch (peer->p_hdr.info.pi_state) {
     217                        case STATE_CLOSED:
     218                                TODO("Handle the CER, validate the peer if needed (and set expiry), set the alt_fifo in the connection, reply a CEA, eventually handshake, move to OPEN or REOPEN state");
     219                                break;
     220                               
     221                        case STATE_WAITCNXACK:
     222                        case STATE_WAITCEA:
     223                                TODO("Election");
     224                                break;
     225                               
     226                        default:
     227                                TODO("Reply with error CEA");
     228                                TODO("Close the connection");
     229                                /* reject_incoming_connection */
     230                       
     231                }
     232               
     233                free(ev_data);
     234                goto psm_loop;
     235        }
     236       
    229237        /* MSG_RECEIVED: fd_p_expi_update(struct fd_peer * peer ) */
    230238        /* If timeout or OPEN : call cb if defined */
     
    241249psm_end:
    242250        pthread_cleanup_pop(1); /* set STATE_ZOMBIE */
     251        peer->p_psm = (pthread_t)NULL;
     252        pthread_detach(pthread_self());
    243253        return NULL;
    244254}       
    245        
    246        
    247 
    248255
    249256/* Create the PSM thread of one peer structure */
     
    267274        TRACE_ENTRY("%p", peer);
    268275        CHECK_PARAMS( CHECK_PEER(peer) );
     276       
    269277        if (peer->p_hdr.info.pi_state != STATE_ZOMBIE) {
    270                 CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, NULL) );
     278                CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, NULL) );
    271279        } else {
    272280                TRACE_DEBUG(FULL, "Peer '%s' was already terminated", peer->p_hdr.info.pi_diamid);
Note: See TracChangeset for help on using the changeset viewer.