Annotation of researchv8dc/sys/chaosld/chsend.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *             C H  S E N D
                      3:  *
                      4:  * Chaosnet line discipline - routines to deal with sending out packets.
                      5:  *
                      6:  *
                      7:  * (c) Copyright 1985  Nirvonics, Inc.
                      8:  *
                      9:  * Written by Kurt Gollhardt
                     10:  * Last update Thu Feb 28 14:42:57 1985
                     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: #include "../chaosld/chrouteld.h"
                     27: 
                     28: /*
                     29:  * Send a STS packet on this connection
                     30:  *     if allocation fails it is not sent
                     31:  */
                     32: sendsts(conn)
                     33: register struct connection *conn;
                     34: {
                     35:      register struct packet *pkt;
                     36: 
                     37:      if ((pkt = new_packet()) != NOPKT) {
                     38:           setconn(conn, pkt);
                     39:           setsts(conn, pkt);
                     40:           sendctl(pkt);
                     41:      }
                     42: }
                     43: 
                     44: /*
                     45:  * Send a SNS packet on this connection
                     46:  *     if allocation failed nothing is sent
                     47:  */
                     48: sendsns(conn)
                     49:      register struct connection    *conn;
                     50: {
                     51:      register struct packet   *pkt;
                     52: 
                     53:      if ((pkt = new_packet()) != NOPKT) {
                     54:           setconn(conn, pkt);
                     55:           pkt->pk_op = SNSOP;
                     56:           setack(conn, pkt);
                     57:           sendctl(pkt);
                     58:      }
                     59: }
                     60: 
                     61: /*
                     62:  * Send an open in response to an RFC
                     63:  */
                     64: 
                     65: sendopn(conn)
                     66:      register struct connection    *conn;
                     67: {
                     68:      register struct packet   *pkt;
                     69: 
                     70:      if ((pkt = new_packet()) != NOPKT) {
                     71:           conn->cn_rsts = conn->cn_rwsize >> 1;
                     72:          conn->cn_tlast = 0;
                     73:          setconn(conn, pkt);
                     74:          setsts(conn, pkt);
                     75:          pkt->pk_op = OPNOP;
                     76:           chld_write(conn, pkt);
                     77:      }
                     78: }
                     79: 
                     80: /*
                     81:  * Sendctl - send a control packet that will not be acknowledged and
                     82:  *     will not be retransmitted (this actual packet).
                     83:  *     If anything is wrong (no path, bad subnet) we just throw it
                     84:  *     away. Remember, next is assumed to be == NOPKT.
                     85:  */
                     86: sendctl(pkt)
                     87: register struct packet *pkt;
                     88: {
                     89:      register struct chroute *r;
                     90: 
                     91:      debug(DSEND, (printf("Sending: %d ", pkt->pk_op), prpkt(pkt, "ctl"), printf("\n")));
                     92:      ch_busy++;
                     93:      put_packet(WR(ChaosQ), pkt);
                     94:      --ch_busy;
                     95: }
                     96: 
                     97: /*
                     98:  * Senddata - send a list of controlled packets.
                     99:  *     Similar to sendctl, but stuffs time, handles a list, and marks
                    100:  *     the packets as transmitted.
                    101:  */
                    102: senddata(pkt)
                    103: register struct packet *pkt;
                    104: {
                    105:      register struct packet   *nextpk;
                    106: 
                    107:      debug(DSEND, (printf("Sending: %d ", pkt->pk_op), prpkt(pkt, "data"), printf("\n")));
                    108:      ch_busy++;
                    109:      do {
                    110:           pkt->time = Chclock;
                    111:           nextpk = pkt->next;
                    112:           copy_packet(WR(ChaosQ), pkt);
                    113:           xmitdone(pkt);
                    114:      } while ((pkt = nextpk) != NOPKT);
                    115:      --ch_busy;
                    116: }
                    117: 
                    118: /*
                    119:  * Send the given RUT packet out on the given tranceiver, which has the given
                    120:  * cost.  If the "copy" flag is true, make a copy of the packet.
                    121:  * Note that if copy is not set, the packet data gets modified.
                    122:  */
                    123: sendrut(pkt, ifp, cost, copy)
                    124: register struct packet *pkt;
                    125: register struct chif *ifp;
                    126: unsigned short cost;
                    127: int copy;
                    128: {
                    129:      register struct rut_data *rd;
                    130:      struct rut_data *rdend;
                    131: 
                    132:      pkt->pk_saddr = ifp->my_addr;
                    133:      pkt->pk_daddr.ch_subnet = ifp->my_addr.ch_subnet;
                    134: 
                    135:      rdend = (struct rut_data *)(pkt->data->rptr + pkt->pk_len);
                    136:      for (rd = (struct rut_data *)pkt->data->rptr; rd < rdend; rd++)
                    137:           rd->rd_cost += cost;
                    138: 
                    139:      ch_busy++;
                    140:      if (copy) {
                    141:          copy_packet(WR(ChaosQ), pkt);
                    142:          for (rd = (struct rut_data *)pkt->data->rptr; rd < rdend; rd++)
                    143:               rd->rd_cost -= cost;
                    144:      } else
                    145:          put_packet(WR(ChaosQ), pkt);
                    146:      --ch_busy;
                    147: }
                    148: 
                    149: /*
                    150:  * Send a LOS in response to the given packet.
                    151:  * Don't bother if the packet is itself a LOS or a CLS since the other
                    152:  * end doesn't care anyway and would only return it again.
                    153:  * Append the host name to the error message.
                    154:  */
                    155: sendlos(pkt, str, msglen)
                    156:      register struct packet   *pkt;
                    157:      char      *str;
                    158:      int       msglen;
                    159: {
                    160:      if (pkt->pk_op == LOSOP || pkt->pk_op == CLSOP)
                    161:           free_packet(pkt);
                    162:      else {
                    163:           register struct block    *bp;
                    164:           register char  *cp;
                    165:           register int   namelen;
                    166: 
                    167:          for (namelen = 0, cp = Chmyname; *cp++;)
                    168:               ++namelen;
                    169: 
                    170:           free_pkdata(pkt);
                    171:           append_packet(pkt, str, msglen);
                    172:           append_packet(pkt, " (from ", 7);
                    173:           append_packet(pkt, Chmyname, namelen);
                    174:           append_packet(pkt, ")", 1);
                    175: 
                    176:           pkt->pk_op = LOSOP;
                    177:           reflect(pkt);
                    178:      }
                    179: }
                    180: 
                    181: /*
                    182:  * Send a control packet back to its source
                    183:  */
                    184: reflect(pkt)
                    185:      register struct packet   *pkt;
                    186: {
                    187:      register short temp;
                    188: 
                    189:      temp = pkt->pk_sidx.ci_idx;
                    190:      pkt->pk_sidx = pkt->pk_didx;
                    191:      pkt->pk_didx.ci_idx = temp;
                    192:      temp = pkt->pk_saddr.ch_addr;
                    193:      pkt->pk_saddr = pkt->pk_daddr;
                    194:      pkt->pk_daddr.ch_addr = temp;
                    195:      sendctl(pkt);
                    196: }
                    197: 
                    198: /*
                    199:  * Indicate that actual transmission of the current packet has been completed.
                    200:  * Note that this merely means that we've sent it on to the routing line
                    201:  * discipline, and there's no guarantee that it's really gone anywhere.
                    202:  *
                    203:  * If this is a controlled packet and the connection is open, put the packet
                    204:  * on the queue of transmitted packets awaiting acknowledgements, otherwise
                    205:  * throw away the packet.
                    206:  */
                    207: xmitdone(pkt)
                    208:      register struct packet   *pkt;
                    209: {
                    210:      register struct connection *conn;
                    211:      register struct packet   *npkt;
                    212: 
                    213:      ch_busy++;
                    214:      if (CONTROLLED(pkt) && pkt->pk_sidx.ci_tidx < NCH &&
                    215:                (conn = Chconn[pkt->pk_sidx.ci_tidx]) != NOCONN &&
                    216:                pkt->pk_sidx.ci_idx == conn->cn_lidx.ci_idx &&
                    217:                (conn->cn_state == CSOPEN || conn->cn_state == CSRFCSENT) &&
                    218:                cmp_gt(pkt->pk_pkn, conn->cn_trecvd)) {
                    219:           pkt->time = Chclock;
                    220:           if ((npkt = conn->cn_thead) == NOPKT || 
                    221:                     cmp_lt(pkt->pk_pkn, npkt->pk_pkn)) {
                    222:                pkt->next = npkt;
                    223:                conn->cn_thead = pkt;
                    224:           } else {
                    225:                for(; npkt->next != NOPKT; npkt = npkt->next)
                    226:                     if(cmp_lt(pkt->pk_pkn, npkt->next->pk_pkn))
                    227:                          break;
                    228:                pkt->next = npkt->next;
                    229:                npkt->next = pkt;
                    230:           }
                    231:           if(pkt->next == NOPKT)
                    232:                conn->cn_ttail = pkt;
                    233:      } else
                    234:           free_packet(pkt);
                    235:      --ch_busy;
                    236: }
                    237: 
                    238: #endif

unix.superglobalmegacorp.com

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