Annotation of 43BSDReno/contrib/isode-beta/snmp/tcp.c, revision 1.1.1.1

1.1       root        1: /* tcp.c - MIB realization of the TCP group */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/snmp/RCS/tcp.c,v 7.7 90/07/09 14:49:43 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/snmp/RCS/tcp.c,v 7.7 90/07/09 14:49:43 mrose Exp $
                      9:  *
                     10:  * Contributed by NYSERNet Inc.  This work was partially supported by the
                     11:  * U.S. Defense Advanced Research Projects Agency and the Rome Air Development
                     12:  * Center of the U.S. Air Force Systems Command under contract number
                     13:  * F30602-88-C-0016.
                     14:  *
                     15:  *
                     16:  * $Log:       tcp.c,v $
                     17:  * Revision 7.7  90/07/09  14:49:43  mrose
                     18:  * sync
                     19:  * 
                     20:  * Revision 7.6  90/06/05  20:47:27  mrose
                     21:  * touch-up
                     22:  * 
                     23:  * Revision 7.5  90/04/23  00:08:16  mrose
                     24:  * touch-up
                     25:  * 
                     26:  * Revision 7.4  90/04/18  08:52:06  mrose
                     27:  * oid_normalize
                     28:  * 
                     29:  * Revision 7.3  90/02/27  18:50:07  mrose
                     30:  * unix stuff
                     31:  * 
                     32:  * Revision 7.2  90/01/27  08:22:09  mrose
                     33:  * touch-up
                     34:  * 
                     35:  * Revision 7.1  89/12/11  10:40:40  mrose
                     36:  * touch-up
                     37:  * 
                     38:  * Revision 7.0  89/11/23  22:23:35  mrose
                     39:  * Release 6.0
                     40:  * 
                     41:  */
                     42: 
                     43: /*
                     44:  *                               NOTICE
                     45:  *
                     46:  *    Acquisition, use, and distribution of this module and related
                     47:  *    materials are subject to the restrictions of a license agreement.
                     48:  *    Consult the Preface in the User's Manual for the full terms of
                     49:  *    this agreement.
                     50:  *
                     51:  */
                     52: 
                     53: 
                     54: #include <stdio.h>
                     55: #include "mib.h"
                     56: #ifdef  BSD43_Tahoe
                     57: #include <machine/endian.h>
                     58: #endif
                     59: 
                     60: #include "internet.h"
                     61: #ifdef BSD44
                     62: #include <machine/machparam.h>
                     63: #endif
                     64: #include <sys/protosw.h>
                     65: #include <sys/socketvar.h>
                     66: #include <net/route.h>
                     67: #include <netinet/in_systm.h>
                     68: #ifdef BSD44
                     69: #include <netinet/ip.h>
                     70: #endif
                     71: #include <netinet/in_pcb.h>
                     72: #include <netinet/tcp.h>
                     73: #include <netinet/tcp_fsm.h>
                     74: #include <netinet/tcp_timer.h>
                     75: #include <netinet/tcp_var.h>
                     76: 
                     77: /*  */
                     78: 
                     79: #define        RTOA_OTHER      1               /* tcpRtoAlgorithm */
                     80: #define        RTOA_VANJ       4               /*   ..  */
                     81: 
                     82: #define        MXCN_NONE       (-1)            /* tcpMaxConn */
                     83: 
                     84: 
                     85: static struct tcpstat tcpstat;
                     86: 
                     87: static int tcpConnections;
                     88: 
                     89: /*  */
                     90: 
                     91: #define        tcpRtoAlgorithm 0
                     92: #define        tcpRtoMin       1
                     93: #define        tcpRtoMax       2
                     94: #define        tcpMaxConn      3
                     95: #define        tcpActiveOpens  4
                     96: #define        tcpPassiveOpens 5
                     97: #define        tcpAttemptFails 6
                     98: #define        tcpEstabResets  7
                     99: #define        tcpCurrEstab    8
                    100: #define        tcpInSegs       9
                    101: #define        tcpOutSegs      10
                    102: #define        tcpRetransSegs  11
                    103: #ifndef        SUNOS4
                    104: #define        tcpInErrs       12
                    105: #else
                    106: #undef tcpInErrs       12
                    107: #endif
                    108: #undef tcpOutRsts      13              /* NOT IMPLEMENTED */
                    109: 
                    110: 
                    111: static int  o_tcp (oi, v, offset)
                    112: OI     oi;
                    113: register struct type_SNMP_VarBind *v;
                    114: int    offset;
                    115: {
                    116:     int            ifvar;
                    117:     register struct tcpstat *tcps = &tcpstat;
                    118:     register OID    oid = oi -> oi_name;
                    119:     register OT            ot = oi -> oi_type;
                    120:     static   int lastq = -1;
                    121: 
                    122:     ifvar = (int) ot -> ot_info;
                    123:     switch (offset) {
                    124:        case type_SNMP_PDUs_get__request:
                    125:            if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1
                    126:                    || oid -> oid_elements[oid -> oid_nelem - 1] != 0)
                    127:                return int_SNMP_error__status_noSuchName;
                    128:            break;
                    129: 
                    130:        case type_SNMP_PDUs_get__next__request:
                    131:            if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
                    132:                OID     new;
                    133: 
                    134:                if ((new = oid_extend (oid, 1)) == NULLOID)
                    135:                    return int_SNMP_error__status_genErr;
                    136:                new -> oid_elements[new -> oid_nelem - 1] = 0;
                    137: 
                    138:                if (v -> name)
                    139:                    free_SNMP_ObjectName (v -> name);
                    140:                v -> name = new;
                    141:            }
                    142:            else
                    143:                return NOTOK;
                    144:            break;
                    145: 
                    146:        default:
                    147:            return int_SNMP_error__status_genErr;
                    148:     }
                    149: 
                    150:     switch (ifvar) {
                    151:        case tcpCurrEstab:
                    152:            if (get_connections () == NOTOK)
                    153:                return int_SNMP_error__status_genErr;
                    154:            break;
                    155: 
                    156:        default:
                    157:            if (quantum != lastq) {
                    158:                lastq = quantum;
                    159: 
                    160:                if (getkmem (nl + N_TCPSTAT, (caddr_t) tcps, sizeof *tcps)
                    161:                        == NOTOK)
                    162:                    return int_SNMP_error__status_genErr;
                    163:            }
                    164:            break;
                    165:     }
                    166: 
                    167:     switch (ifvar) {
                    168:        case tcpRtoAlgorithm:
                    169: #ifdef TCPTV_REXMTMAX
                    170:            return o_integer (oi, v, RTOA_VANJ);
                    171: #else
                    172:            return o_integer (oi, v, RTOA_OTHER);
                    173: #endif
                    174: 
                    175:        case tcpRtoMin:
                    176:            return o_integer (oi, v, TCPTV_MIN * 100);  /* milliseconds */
                    177: 
                    178: #ifdef TCPTV_REXMTMAX
                    179:        case tcpRtoMax:
                    180:            return o_integer (oi, v, TCPTV_REXMTMAX * 100); /*   .. */
                    181: #endif
                    182: 
                    183:        case tcpMaxConn:
                    184:            return o_integer (oi, v, MXCN_NONE);
                    185: 
                    186: #ifdef TCPTV_REXMTMAX
                    187:        case tcpActiveOpens:
                    188:            return o_integer (oi, v, tcps -> tcps_connattempt);
                    189: 
                    190:        case tcpPassiveOpens:
                    191:            return o_integer (oi, v, tcps -> tcps_accepts);
                    192: 
                    193:        case tcpAttemptFails:
                    194:            return o_integer (oi, v, tcps -> tcps_conndrops);
                    195: 
                    196:        case tcpEstabResets:
                    197:            return o_integer (oi, v, tcps -> tcps_drops);
                    198: #endif
                    199: 
                    200:        case tcpCurrEstab:
                    201:            return o_integer (oi, v, tcpConnections);
                    202: 
                    203: #ifdef TCPTV_REXMTMAX
                    204:        case tcpInSegs:
                    205:            return o_integer (oi, v, tcps -> tcps_rcvtotal);
                    206: 
                    207:        case tcpOutSegs:
                    208:            return o_integer (oi, v, tcps -> tcps_sndtotal
                    209:                                   - tcps -> tcps_sndrexmitpack);
                    210: 
                    211:        case tcpRetransSegs:
                    212:            return o_integer (oi, v, tcps -> tcps_sndrexmitpack);
                    213: #endif
                    214: 
                    215: #ifdef tcpInErrs
                    216:        case tcpInErrs:
                    217: #ifndef        BSD44
                    218:            return o_integer (oi, v, tcps -> tcps_badsegs);
                    219: #else
                    220:            return o_integer (oi, v, tcps -> tcps_rcvbadsum
                    221:                                   + tcps -> tcps_rcvbadoff
                    222:                                   + tcps -> tcps_rcvshort);
                    223: #endif
                    224: #endif
                    225: 
                    226:        default:
                    227:            return int_SNMP_error__status_noSuchName;
                    228:     }
                    229: }
                    230: 
                    231: /*  */
                    232: 
                    233: static int     tcp_states[TCP_NSTATES];
                    234: 
                    235: 
                    236: struct tcptab {
                    237: #define        TT_SIZE 10                      /* object instance */
                    238:     unsigned int   tt_instance[TT_SIZE];
                    239: 
                    240:     struct inpcb   tt_pcb;             /* protocol control block */
                    241: 
                    242:     struct socket  tt_socb;            /* socket info */
                    243: 
                    244:     struct tcpcb   tt_tcpb;            /* TCP info */
                    245: 
                    246:     struct tcptab *tt_next;
                    247: };
                    248: 
                    249: static struct tcptab *tts = NULL;
                    250: 
                    251: 
                    252: struct tcptab *get_tcpent ();
                    253: 
                    254: /*  */
                    255: 
                    256: #define        tcpConnState    0
                    257: #define        tcpConnLocalAddress 1
                    258: #define        tcpConnLocalPort 2
                    259: #define        tcpConnRemAddress 3
                    260: #define        tcpConnRemPort  4
                    261: #define        unixTcpConnSendQ 5
                    262: #define        unixTcpConnRecvQ 6
                    263: 
                    264: 
                    265: static int  o_tcp_conn (oi, v, offset)
                    266: OI     oi;
                    267: register struct type_SNMP_VarBind *v;
                    268: int    offset;
                    269: {
                    270:     int            ifvar;
                    271:     register int    i;
                    272:     register unsigned int *ip,
                    273:                          *jp;
                    274:     register struct tcptab *tt;
                    275:     struct sockaddr_in netaddr;
                    276:     register OID    oid = oi -> oi_name;
                    277:     OID            new;
                    278:     register OT            ot = oi -> oi_type;
                    279: 
                    280:     if (get_connections () == NOTOK)
                    281:        return int_SNMP_error__status_genErr;
                    282: 
                    283:     ifvar = (int) ot -> ot_info;
                    284:     switch (offset) {
                    285:        case type_SNMP_PDUs_get__request:
                    286:            if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + TT_SIZE)
                    287:                return int_SNMP_error__status_noSuchName;
                    288:            if ((tt = get_tcpent (oid -> oid_elements + oid -> oid_nelem
                    289:                                      - TT_SIZE, 0)) == NULL)
                    290:                return int_SNMP_error__status_noSuchName;
                    291:            break;
                    292: 
                    293:        case type_SNMP_PDUs_get__next__request:
                    294:            if ((i = oid -> oid_nelem - ot -> ot_name -> oid_nelem) != 0
                    295:                    && i < TT_SIZE) {
                    296:                for (jp = (ip = oid -> oid_elements + ot -> ot_name -> oid_nelem - 1) + i;
                    297:                         jp > ip;
                    298:                         jp--)
                    299:                    if (*jp != 0)
                    300:                        break;
                    301:                if (jp == ip)
                    302:                    oid -> oid_nelem = ot -> ot_name -> oid_nelem;
                    303:                else {
                    304:                    if ((new = oid_normalize (oid, TT_SIZE - i, 65536))
                    305:                            == NULLOID)
                    306:                        return int_SNMP_error__status_genErr;
                    307:                    if (v -> name)
                    308:                        free_SNMP_ObjectName (v -> name);
                    309:                    v -> name = oid = new;
                    310:                }
                    311:            }
                    312: 
                    313:            if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) {
                    314:                if ((tt = tts) == NULL)
                    315:                    return NOTOK;
                    316: 
                    317:                if ((new = oid_extend (oid, TT_SIZE)) == NULLOID)
                    318:                    return int_SNMP_error__status_genErr;
                    319:                ip = new -> oid_elements + new -> oid_nelem - TT_SIZE;
                    320:                jp = tt -> tt_instance;
                    321:                for (i = TT_SIZE; i > 0; i--)
                    322:                    *ip++ = *jp++;
                    323: 
                    324:                if (v -> name)
                    325:                    free_SNMP_ObjectName (v -> name);
                    326:                v -> name = new;
                    327:            }
                    328:            else {
                    329:                if ((tt = get_tcpent (ip = oid -> oid_elements
                    330:                                         + oid -> oid_nelem - TT_SIZE, 1))
                    331:                        == NULL)
                    332:                    return NOTOK;
                    333: 
                    334:                jp = tt -> tt_instance;
                    335:                for (i = TT_SIZE; i > 0; i--)
                    336:                    *ip++ = *jp++;
                    337:            }
                    338:            break;
                    339: 
                    340:        default:
                    341:            return int_SNMP_error__status_genErr;
                    342:     }
                    343: 
                    344:     switch (ifvar) {
                    345:        case tcpConnState:
                    346:            if ((i = tt -> tt_tcpb.t_state) < 0
                    347:                    || i >= sizeof tcp_states / sizeof tcp_states[0])
                    348:                return int_SNMP_error__status_genErr;
                    349:            return o_integer (oi, v, tcp_states[i]);
                    350:        
                    351:        case tcpConnLocalAddress:
                    352:            netaddr.sin_addr = tt -> tt_pcb.inp_laddr;  /* struct copy */
                    353:            return o_ipaddr (oi, v, &netaddr);
                    354:            
                    355:        case tcpConnLocalPort:
                    356:            return o_integer (oi, v, ntohs (tt -> tt_pcb.inp_lport) & 0xffff);
                    357: 
                    358:        case tcpConnRemAddress:
                    359:            netaddr.sin_addr = tt -> tt_pcb.inp_faddr;  /* struct copy */
                    360:            return o_ipaddr (oi, v, &netaddr);
                    361: 
                    362:        case tcpConnRemPort:
                    363:            return o_integer (oi, v, ntohs (tt -> tt_pcb.inp_fport) & 0xffff);
                    364: 
                    365:        case unixTcpConnSendQ:
                    366:            return o_integer (oi, v, tt -> tt_socb.so_snd.sb_cc);
                    367:        
                    368:        case unixTcpConnRecvQ:
                    369:            return o_integer (oi, v, tt -> tt_socb.so_rcv.sb_cc);
                    370:        
                    371:        default:
                    372:            return int_SNMP_error__status_noSuchName;
                    373:     }
                    374: }
                    375: 
                    376: /*  */
                    377: 
                    378: static int  tt_compar (a, b)
                    379: struct tcptab **a,
                    380:              **b;
                    381: {
                    382:     return elem_cmp ((*a) -> tt_instance, TT_SIZE,
                    383:                     (*b) -> tt_instance, TT_SIZE);
                    384: }
                    385: 
                    386: 
                    387: static int  get_connections () {
                    388:     register int    i;
                    389:     register unsigned int  *cp;
                    390:     register struct tcptab *ts,
                    391:                           *tp,
                    392:                          **tsp;
                    393:     register struct inpcb  *ip;
                    394:     struct inpcb *head,
                    395:                  tcb;
                    396:     struct nlist nzs;
                    397:     register struct nlist *nz = &nzs;
                    398:     static   int first_time = 1;
                    399:     static   int lastq = -1;
                    400: 
                    401:     if (quantum == lastq)
                    402:        return OK;
                    403:     lastq = quantum;
                    404: 
                    405:     for (ts = tts; ts; ts = tp) {
                    406:        tp = ts -> tt_next;
                    407: 
                    408:        free ((char *) ts);
                    409:     }
                    410:     tts = NULL;
                    411: 
                    412:     if (getkmem (nl + N_TCB, (char *) &tcb, sizeof tcb) == NOTOK)
                    413:        return NOTOK;
                    414:     head = (struct inpcb *) nl[N_TCB].n_value;
                    415: 
                    416:     tsp = &tts, i = 0;
                    417:     ip = &tcb;
                    418:     while (ip -> inp_next != head) {
                    419:        if ((ts = (struct tcptab *) calloc (1, sizeof *ts)) == NULL)
                    420:            adios (NULLCP, "out of memory");
                    421:                            /* no check needed for duplicate connections... */
                    422:        *tsp = ts, tsp = &ts -> tt_next, i++;
                    423: 
                    424:        nz -> n_name = "struct inpcb",
                    425:        nz -> n_value = (unsigned long) ip -> inp_next;
                    426:        if (getkmem (nz, (caddr_t) &ts -> tt_pcb, sizeof ts -> tt_pcb)
                    427:                == NOTOK)
                    428:            return NOTOK;
                    429:        ip = &ts -> tt_pcb;
                    430: 
                    431:        nz ->n_name = "struct socket",
                    432:        nz -> n_value = (unsigned long) ip -> inp_socket;
                    433:        if (getkmem (nz, (caddr_t) &ts -> tt_socb, sizeof ts -> tt_socb)
                    434:                == NOTOK)
                    435:            return NOTOK;
                    436: 
                    437:        nz ->n_name = "struct tcb",
                    438:        nz -> n_value = (unsigned long) ip -> inp_ppcb;
                    439:        if (getkmem (nz, (caddr_t) &ts -> tt_tcpb, sizeof ts -> tt_tcpb)
                    440:                == NOTOK)
                    441:            return NOTOK;
                    442: 
                    443:        cp = ts -> tt_instance;
                    444:        cp += ipaddr2oid (cp, &ip -> inp_laddr);
                    445:        *cp++ = ntohs (ip -> inp_lport) & 0xffff;
                    446:        cp += ipaddr2oid (cp, &ip -> inp_faddr);
                    447:        *cp++ = ntohs (ip -> inp_fport) & 0xffff;
                    448: 
                    449:        if (debug && first_time) {
                    450:            OIDentifier oids;
                    451: 
                    452:            oids.oid_elements = ts -> tt_instance;
                    453:            oids.oid_nelem = TT_SIZE;
                    454:            advise (LLOG_DEBUG, NULLCP,
                    455:                    "add connection: %s", sprintoid (&oids));
                    456:        }
                    457:     }
                    458:     first_time = 0;
                    459: 
                    460:     if ((tcpConnections = i) > 1) {
                    461:        register struct tcptab **base,
                    462:                               **tse;
                    463: 
                    464:        if ((base = (struct tcptab **) malloc ((unsigned) (i * sizeof *base)))
                    465:                == NULL)
                    466:            adios (NULLCP, "out of memory");
                    467: 
                    468:        tse = base;
                    469:        for (ts = tts; ts; ts = ts -> tt_next)
                    470:            *tse++ = ts;
                    471: 
                    472:        qsort ((char *) base, i, sizeof *base, tt_compar);
                    473: 
                    474:        tsp = base;
                    475:        ts = tts = *tsp++;
                    476: 
                    477:        while (tsp < tse) {
                    478:            ts -> tt_next = *tsp;
                    479:            ts = *tsp++;
                    480:        }
                    481:        ts -> tt_next = NULL;
                    482: 
                    483:        free ((char *) base);
                    484:     }
                    485: 
                    486:     return OK;    
                    487: }
                    488: 
                    489: /*  */
                    490: 
                    491: static struct tcptab *get_tcpent (ip, isnext)
                    492: register unsigned int *ip;
                    493: int    isnext;
                    494: {
                    495:     register struct tcptab *tt;
                    496: 
                    497:     for (tt = tts; tt; tt = tt -> tt_next)
                    498:        switch (elem_cmp (tt -> tt_instance, TT_SIZE, ip, TT_SIZE)) {
                    499:            case 0:
                    500:                return (isnext ? tt -> tt_next : tt);
                    501: 
                    502:            case 1:
                    503:                return (isnext ? tt : NULL);
                    504:        }
                    505: 
                    506:     return NULL;
                    507: }
                    508: 
                    509: /*  */
                    510: 
                    511: init_tcp () {
                    512:     register OT            ot;
                    513: 
                    514:     if (ot = text2obj ("tcpRtoAlgorithm"))
                    515:        ot -> ot_getfnx = o_tcp,
                    516:        ot -> ot_info = (caddr_t) tcpRtoAlgorithm;
                    517:     if (ot = text2obj ("tcpRtoMin"))
                    518:        ot -> ot_getfnx = o_tcp,
                    519:        ot -> ot_info = (caddr_t) tcpRtoMin;
                    520: #ifdef TCPTV_REXMTMAX
                    521:     if (ot = text2obj ("tcpRtoMax"))
                    522:        ot -> ot_getfnx = o_tcp,
                    523:        ot -> ot_info = (caddr_t) tcpRtoMax;
                    524: #endif
                    525:     if (ot = text2obj ("tcpMaxConn"))
                    526:        ot -> ot_getfnx = o_tcp,
                    527:        ot -> ot_info = (caddr_t) tcpMaxConn;
                    528: #ifdef TCPTV_REXMTMAX
                    529:     if (ot = text2obj ("tcpActiveOpens"))
                    530:        ot -> ot_getfnx = o_tcp,
                    531:        ot -> ot_info = (caddr_t) tcpActiveOpens;
                    532:     if (ot = text2obj ("tcpPassiveOpens"))
                    533:        ot -> ot_getfnx = o_tcp,
                    534:        ot -> ot_info = (caddr_t) tcpPassiveOpens;
                    535:     if (ot = text2obj ("tcpAttemptFails"))
                    536:        ot -> ot_getfnx = o_tcp,
                    537:        ot -> ot_info = (caddr_t) tcpAttemptFails;
                    538:     if (ot = text2obj ("tcpEstabResets"))
                    539:        ot -> ot_getfnx = o_tcp,
                    540:        ot -> ot_info = (caddr_t) tcpEstabResets;
                    541: #endif
                    542:     if (ot = text2obj ("tcpCurrEstab"))
                    543:        ot -> ot_getfnx = o_tcp,
                    544:        ot -> ot_info = (caddr_t) tcpCurrEstab;
                    545: #ifdef TCPTV_REXMTMAX
                    546:     if (ot = text2obj ("tcpInSegs"))
                    547:        ot -> ot_getfnx = o_tcp,
                    548:        ot -> ot_info = (caddr_t) tcpInSegs;
                    549:     if (ot = text2obj ("tcpOutSegs"))
                    550:        ot -> ot_getfnx = o_tcp,
                    551:        ot -> ot_info = (caddr_t) tcpOutSegs;
                    552:     if (ot = text2obj ("tcpRetransSegs"))
                    553:        ot -> ot_getfnx = o_tcp,
                    554:        ot -> ot_info = (caddr_t) tcpRetransSegs;
                    555: #endif
                    556: #ifdef tcpInErrs
                    557:     if (ot = text2obj ("tcpInErrs"))
                    558:        ot -> ot_getfnx = o_tcp,
                    559:        ot -> ot_info = (caddr_t) tcpInErrs;
                    560: #endif
                    561: #ifdef tcpOutRsts
                    562:     if (ot = text2obj ("tcpOutRsts"))
                    563:        ot -> ot_getfnx = o_tcp,
                    564:        ot -> ot_info = (caddr_t) tcpOutRsts;
                    565: #endif
                    566: 
                    567:     if (ot = text2obj ("tcpConnState"))
                    568:        ot -> ot_getfnx = o_tcp_conn,
                    569:        ot -> ot_info = (caddr_t) tcpConnState;
                    570:     if (ot = text2obj ("tcpConnLocalAddress"))
                    571:        ot -> ot_getfnx = o_tcp_conn,
                    572:        ot -> ot_info = (caddr_t) tcpConnLocalAddress;
                    573:     if (ot = text2obj ("tcpConnLocalPort"))
                    574:        ot -> ot_getfnx = o_tcp_conn,
                    575:        ot -> ot_info = (caddr_t) tcpConnLocalPort;
                    576:     if (ot = text2obj ("tcpConnRemAddress"))
                    577:        ot -> ot_getfnx = o_tcp_conn,
                    578:        ot -> ot_info = (caddr_t) tcpConnRemAddress;
                    579:     if (ot = text2obj ("tcpConnRemPort"))
                    580:        ot -> ot_getfnx = o_tcp_conn,
                    581:        ot -> ot_info = (caddr_t) tcpConnRemPort;
                    582: 
                    583:     if (ot = text2obj ("unixTcpConnSendQ"))
                    584:        ot -> ot_getfnx = o_tcp_conn,
                    585:        ot -> ot_info = (caddr_t) unixTcpConnSendQ;
                    586:     if (ot = text2obj ("unixTcpConnRecvQ"))
                    587:        ot -> ot_getfnx = o_tcp_conn,
                    588:        ot -> ot_info = (caddr_t) unixTcpConnRecvQ;
                    589: 
                    590:     tcp_states[TCPS_CLOSED] = 1;
                    591:     tcp_states[TCPS_LISTEN] = 2;
                    592:     tcp_states[TCPS_SYN_SENT] = 3;
                    593:     tcp_states[TCPS_SYN_RECEIVED] = 4;
                    594:     tcp_states[TCPS_ESTABLISHED] = 5;
                    595:     tcp_states[TCPS_CLOSE_WAIT] = 8;
                    596:     tcp_states[TCPS_FIN_WAIT_1] = 6;
                    597:     tcp_states[TCPS_CLOSING] = 10;
                    598:     tcp_states[TCPS_LAST_ACK] = 9;
                    599:     tcp_states[TCPS_FIN_WAIT_2] = 7;
                    600:     tcp_states[TCPS_TIME_WAIT] = 11;
                    601: }

unix.superglobalmegacorp.com

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