|
|
1.1 ! root 1: /* ! 2: * C H C O N N ! 3: * ! 4: * Connection handling utilities for the Chaosnet line discipline. ! 5: * ! 6: * ! 7: * (c) Copyright 1984 Nirvonics, Inc. ! 8: * ! 9: * Written by Kurt Gollhardt ! 10: * Last update Thu Dec 6 13:47:21 1984 ! 11: * ! 12: * This software is the property of Nirvonics, Inc. ! 13: * All rights reserved. ! 14: * ! 15: */ ! 16: ! 17: #include "ch.h" ! 18: #if NCH > 0 ! 19: #include "../h/param.h" ! 20: #include "../h/systm.h" ! 21: #include "../h/stream.h" ! 22: #include "../h/conf.h" ! 23: #include "../chaosld/types.h" ! 24: #include "../chaosld/constants.h" ! 25: #include "../chaosld/globals.h" ! 26: ! 27: ! 28: /* ! 29: * Allocate a connection and return it, also allocating a slot in Chconntab ! 30: */ ! 31: struct connection * ! 32: new_conn(tidx) ! 33: { ! 34: register struct connection *conn; ! 35: static int uniq; ! 36: ! 37: if ((conn = cnalloc()) == NOCONN) { ! 38: debug(DCONN|DABNOR,printf("Conn: alloc failed (packet)\n")); ! 39: Chaos_error = CHNOCONN; ! 40: return(NOCONN); ! 41: } ! 42: ! 43: bfill((char *)conn, sizeof(struct connection), 0); ! 44: if (++uniq == 0) ! 45: uniq = 1; ! 46: conn->cn_lidx.ci_uniq = uniq; ! 47: conn->cn_lidx.ci_tidx = tidx; ! 48: conn->cn_state = 0; ! 49: conn->cn_time = Chclock; ! 50: ! 51: debug(DCONN,printf("Conn: alloc #%x\n", conn->cn_lidx)); ! 52: return(conn); ! 53: } ! 54: ! 55: /* ! 56: * Release a connection - freeing all associated storage. ! 57: * This removes all trace of the connection. ! 58: */ ! 59: free_conn(conn) ! 60: struct connection *conn; ! 61: { ! 62: Chconn[conn->cn_lidx.ci_tidx] = NOCONN; ! 63: freelist(conn->cn_routorder); ! 64: freelist(conn->cn_thead); ! 65: if (conn->cn_toutput != NOPKT) ! 66: free_packet(conn->cn_toutput); ! 67: if (conn->cn_expkt != NOPKT) ! 68: free_packet(conn->cn_expkt); ! 69: if (conn->cn_wait != NOBLOCK) /* ??? */ ! 70: freeb(conn->cn_wait); ! 71: debug(DCONN,printf("Conn: release #%x\n", conn->cn_lidx)); ! 72: cnfree(conn); ! 73: } ! 74: ! 75: ! 76: /* ! 77: * Make a connection closed with given state, at interrupt time. ! 78: * Queue the given packet on the input queue for the user. ! 79: */ ! 80: close_conn(conn, state, pkt) ! 81: register struct connection *conn; ! 82: register struct packet *pkt; ! 83: { ! 84: freelist(conn->cn_thead); ! 85: conn->cn_thead = conn->cn_ttail = NOPKT; ! 86: conn->cn_state = state; ! 87: debug(DCONN|DABNOR, printf("Conn #%x: CLOSED: state: %d\n", ! 88: conn->cn_lidx, state)); ! 89: if (pkt != NOPKT) ! 90: chdrint(conn, pkt); ! 91: chd_newstate(conn); ! 92: } ! 93: ! 94: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.