Navigation



Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • freeDiameter/p_psm.c

    r29 r20  
    5555        #define case_str( _val )\
    5656                case _val : return #_val
     57                case_str(FDEVP_TERMINATE);
    5758                case_str(FDEVP_DUMP_ALL);
    58                 case_str(FDEVP_TERMINATE);
    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);
     59                case_str(FDEVP_MSG_INCOMING);
    6360                case_str(FDEVP_PSM_TIMEOUT);
    6461               
     
    128125}
    129126
     127/* Wait for the next event in the PSM, or timeout */
     128static 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
    130149/* The state machine thread (controler) */
    131150static void * p_psm_th( void * arg )
     
    134153        int created_started = started;
    135154        int event;
    136         size_t ev_sz;
    137155        void * ev_data;
    138156       
     
    163181psm_loop:
    164182        /* Get next event */
    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'",
     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'",
    167185                        STATE_STR(peer->p_hdr.info.pi_state),
    168                         fd_pev_str(event), ev_data, ev_sz,
     186                        fd_pev_str(event), ev_data,
    169187                        peer->p_hdr.info.pi_diamid);
    170188
     
    209227        }
    210228       
    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        
    237229        /* MSG_RECEIVED: fd_p_expi_update(struct fd_peer * peer ) */
    238230        /* If timeout or OPEN : call cb if defined */
     
    249241psm_end:
    250242        pthread_cleanup_pop(1); /* set STATE_ZOMBIE */
    251         peer->p_psm = (pthread_t)NULL;
    252         pthread_detach(pthread_self());
    253243        return NULL;
    254244}       
     245       
     246       
     247
    255248
    256249/* Create the PSM thread of one peer structure */
     
    274267        TRACE_ENTRY("%p", peer);
    275268        CHECK_PARAMS( CHECK_PEER(peer) );
    276        
    277269        if (peer->p_hdr.info.pi_state != STATE_ZOMBIE) {
    278                 CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, 0, NULL) );
     270                CHECK_FCT( fd_event_send(peer->p_events, FDEVP_TERMINATE, NULL) );
    279271        } else {
    280272                TRACE_DEBUG(FULL, "Peer '%s' was already terminated", peer->p_hdr.info.pi_diamid);
Note: See TracChangeset for help on using the changeset viewer.