Annotation of 43BSDReno/contrib/isode-beta/quipu/conn_retry.c, revision 1.1

1.1     ! root        1: /* conn_retry.c - deal with asynchronous A-Associate events */
        !             2: 
        !             3: #ifndef lint
        !             4: static char *rcsid = "$Header: /f/osi/quipu/RCS/conn_retry.c,v 7.0 89/11/23 22:16:56 mrose Rel $";
        !             5: #endif
        !             6: 
        !             7: /*
        !             8:  * $Header: /f/osi/quipu/RCS/conn_retry.c,v 7.0 89/11/23 22:16:56 mrose Rel $
        !             9:  *
        !            10:  *
        !            11:  * $Log:       conn_retry.c,v $
        !            12:  * Revision 7.0  89/11/23  22:16:56  mrose
        !            13:  * Release 6.0
        !            14:  * 
        !            15:  */
        !            16: 
        !            17: /*
        !            18:  *                                NOTICE
        !            19:  *
        !            20:  *    Acquisition, use, and distribution of this module and related
        !            21:  *    materials are subject to the restrictions of a license agreement.
        !            22:  *    Consult the Preface in the User's Manual for the full terms of
        !            23:  *    this agreement.
        !            24:  *
        !            25:  */
        !            26: 
        !            27: 
        !            28: #include "quipu/dsap.h"
        !            29: #include "quipu/util.h"
        !            30: #include "quipu/connection.h"
        !            31: 
        !            32: extern LLog * log_dsap;
        !            33: extern time_t timenow;
        !            34: extern time_t nsap_timeout;
        !            35: 
        !            36: #ifndef NO_STATS
        !            37: extern LLog * log_stat;
        !            38: extern int     dn_print();
        !            39: #endif
        !            40: 
        !            41: struct connection      * conn_alloc();
        !            42: 
        !            43: /*
        !            44: * Deal with an incoming acceptance of association establishment.
        !            45: * Return value says whether anything has happened or not.
        !            46: */
        !            47: conn_retry(conn)
        !            48: struct connection       * conn;
        !            49: {
        !            50:     struct DSAPconnect         dc_s;
        !            51:     struct DSAPconnect         *dc = &dc_s;
        !            52:     struct DSAPindication      di_s;
        !            53:     struct DSAPindication      *di = &di_s;
        !            54:     struct oper_act            * on;
        !            55:     struct oper_act            * onext;
        !            56:     struct oper_act            * ont = NULLOPER;
        !            57:     int                        result;
        !            58:     int                                pstate;
        !            59:     int                                do_next_nsap;
        !            60: 
        !            61:     DLOG (log_dsap,LLOG_TRACE,( "conn_retry()"));
        !            62: 
        !            63:     pstate = conn->cn_state;
        !            64: 
        !            65:     if (timenow - conn->cn_last_used >= nsap_timeout) {
        !            66:        /* this NSAP has had long enough - try the next one... */
        !            67:        LLOG (log_dsap,LLOG_NOTICE,("NSAP hanging (%d)...",conn->cn_ad));
        !            68:        do_next_nsap = 1;
        !            69:        conn->cn_last_used = timenow; /* restart timer */
        !            70:     } else {
        !            71:        do_next_nsap = 0;
        !            72:     }
        !            73: 
        !            74:     switch (conn->cn_ctx)
        !            75:     {
        !            76:     case DS_CTX_X500_DAP:
        !            77:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("DAP context type in conn_retry()"));
        !            78:        conn_extract(conn);
        !            79:        return;
        !            80: 
        !            81:     case DS_CTX_X500_DSP:
        !            82:        watch_dog ("DspAsynBindRetry");
        !            83:        result = DspAsynBindRetry (conn->cn_ad, do_next_nsap, dc, di);
        !            84:        watch_dog_reset ();
        !            85:        break;
        !            86: 
        !            87:     case DS_CTX_QUIPU_DSP:
        !            88:        watch_dog ("QspAsynBindRetry");
        !            89:        result = QspAsynBindRetry (conn->cn_ad, do_next_nsap, dc, di);
        !            90:        watch_dog_reset ();
        !            91:        break;
        !            92: 
        !            93:     default:
        !            94:        LLOG(log_dsap, LLOG_EXCEPTIONS, ("Unknown context type in conn_retry()"));
        !            95:        conn_extract(conn);
        !            96:        return;
        !            97:     }
        !            98: 
        !            99:     switch(result)
        !           100:     {
        !           101:         case CONNECTING_1:
        !           102:            DLOG (log_dsap,LLOG_NOTICE,("D-BIND.RETRY CONNECTING_1 (%d)",conn->cn_ad));
        !           103:            conn->cn_state = CN_CONNECTING1;
        !           104:            DCFREE(dc);
        !           105:        break;
        !           106: 
        !           107:        case CONNECTING_2:
        !           108:            DLOG (log_dsap,LLOG_NOTICE,("D-BIND.RETRY CONNECTING_2 (%d)",conn->cn_ad));
        !           109:            conn->cn_state = CN_CONNECTING2;
        !           110:            DCFREE(dc);
        !           111:        break;
        !           112: 
        !           113:        case NOTOK :
        !           114:            DLOG (log_dsap,LLOG_NOTICE,( "D-BIND.RETRY NOTOK"));
        !           115:            conn->cn_state = CN_FAILED;
        !           116: 
        !           117: #ifndef NO_STATS
        !           118:            pslog(log_stat, LLOG_NOTICE, "Failed (RETRY NOTOK)", dn_print, (caddr_t) conn->cn_dn);
        !           119: #endif
        !           120:            dsa_reliable (conn,FALSE,timenow);
        !           121: 
        !           122:            for(on=conn->cn_operlist; on!=NULLOPER; on=onext)
        !           123:            {
        !           124:                onext = on->on_next_conn;
        !           125:                /* See if there is another DSA to try... */
        !           126:                if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) { 
        !           127:                        LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (NOTOK)..."));
        !           128:                        if (oper_chain (on) == OK) {
        !           129:                                if (ont == NULLOPER)
        !           130:                                        conn->cn_operlist = onext;
        !           131:                                else
        !           132:                                        ont->on_next_conn = onext;
        !           133:                                continue;
        !           134:                        }
        !           135:                }
        !           136:                /* No - we can't do it !!! */
        !           137:                oper_fail_wakeup(on);
        !           138:                ont = on;
        !           139:            }
        !           140:            conn_extract(conn);
        !           141:        break;
        !           142: 
        !           143:        case DONE :
        !           144:            DLOG (log_dsap,LLOG_NOTICE,( "D-BIND.RETRY DONE (%d)",conn->cn_ad));
        !           145:            if( (conn->cn_ad == NOTOK) || (conn_req_aux(conn, dc) != OK))
        !           146:            {
        !           147: #ifndef NO_STATS
        !           148:                pslog(log_stat, LLOG_NOTICE, "Failed (RETRY DONE)", dn_print, (caddr_t) conn->cn_dn);
        !           149: #endif
        !           150:                dsa_reliable (conn,FALSE,timenow);
        !           151:                conn->cn_state = CN_FAILED;
        !           152:                for(on=conn->cn_operlist; on!=NULLOPER; on=onext)
        !           153:                {
        !           154:                        onext = on->on_next_conn;
        !           155:                        /* See if there is another DSA to try... */
        !           156:                        if ((on->on_state != ON_ABANDONED) && (on->on_dsas != NULL_DI_BLOCK)) { 
        !           157:                                LLOG (log_dsap,LLOG_NOTICE,("Trying a different DSA (DONE)..."));
        !           158:                                if (oper_chain (on) == OK) {
        !           159:                                        if (ont == NULLOPER)
        !           160:                                                conn->cn_operlist = onext;
        !           161:                                        else
        !           162:                                                ont->on_next_conn = onext;
        !           163:                                        continue;
        !           164:                                }
        !           165:                        }
        !           166:                        oper_fail_wakeup(on);
        !           167:                        ont = on;
        !           168:                }
        !           169:                DLOG(log_dsap, LLOG_DEBUG, ("conn_retry calling conn_extract 1"));
        !           170:                conn_extract(conn);
        !           171:                DCFREE(dc);
        !           172:                return;
        !           173:            }
        !           174:            DCFREE(dc);
        !           175: 
        !           176:            for(on=conn->cn_operlist; on!=NULLOPER; on=on->on_next_conn)
        !           177:            {
        !           178:                if (on->on_state == ON_ABANDONED)
        !           179:                        oper_fail_wakeup(on);
        !           180: 
        !           181:                else if (oper_send_invoke(on) != OK) {
        !           182:                        LLOG (log_dsap,LLOG_EXCEPTIONS,("oper_send_invoke failed in conn_retry"));
        !           183:                        oper_log(on);
        !           184:                        oper_fail_wakeup(on);
        !           185:                }
        !           186:            }
        !           187:        break;
        !           188: 
        !           189:        default :
        !           190:            DLOG(log_dsap, LLOG_DEBUG, ("conn_retry calling conn_extract 2"));
        !           191:            for(on=conn->cn_operlist; on!=NULLOPER; on=on->on_next_conn)
        !           192:            {
        !           193:                oper_fail_wakeup(on);
        !           194:            }
        !           195:            conn_extract(conn);
        !           196:            DCFREE(dc);
        !           197:        break;
        !           198: 
        !           199:     } /* switch retry */
        !           200: 
        !           201:     if (pstate != conn->cn_state)
        !           202:        conn->cn_last_used = timenow;
        !           203: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.