|
|
1.1 ! root 1: /* ts2x25.c - TPM: X.25 interface */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/tsap/RCS/ts2x25.c,v 7.3 90/07/09 14:51:23 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/tsap/RCS/ts2x25.c,v 7.3 90/07/09 14:51:23 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: ts2x25.c,v $ ! 12: * Revision 7.3 90/07/09 14:51:23 mrose ! 13: * sync ! 14: * ! 15: * Revision 7.2 90/03/23 17:31:30 mrose ! 16: * 8 ! 17: * ! 18: * Revision 7.1 89/12/07 01:07:39 mrose ! 19: * queued writes ! 20: * ! 21: * Revision 7.0 89/11/23 22:30:41 mrose ! 22: * Release 6.0 ! 23: * ! 24: */ ! 25: ! 26: /* ! 27: * NOTICE ! 28: * ! 29: * Acquisition, use, and distribution of this module and related ! 30: * materials are subject to the restrictions of a license agreement. ! 31: * Consult the Preface in the User's Manual for the full terms of ! 32: * this agreement. ! 33: * ! 34: */ ! 35: ! 36: ! 37: /* LINTLIBRARY */ ! 38: ! 39: #include <stdio.h> ! 40: #include "tpkt.h" ! 41: #include "tailor.h" ! 42: ! 43: #ifdef X25 ! 44: #include "x25.h" ! 45: #include <sys/ioctl.h> ! 46: ! 47: static fd_set inprogress; ! 48: static struct NSAPaddr **peers = NULL; ! 49: ! 50: extern int errno; ! 51: ! 52: /* N-CONNECT.REQUEST */ ! 53: ! 54: int x25open (tb, local, remote, td, async) ! 55: register struct tsapblk *tb; ! 56: struct NSAPaddr *local, ! 57: *remote; ! 58: struct TSAPdisconnect *td; ! 59: { ! 60: register int fd; ! 61: int onoff; ! 62: ! 63: /* ! 64: * start_x25_client does nothing with its arguments in the CAMTEC ! 65: * case but there's less #ifdef code this way so... ! 66: */ ! 67: if ((fd = start_x25_client (local)) == NOTOK) ! 68: return tsaplose (td, DR_CONGEST, "socket", "unable to start"); ! 69: ! 70: if (async) { ! 71: if (ioctl (fd, FIONBIO, (onoff = 1, (char *) &onoff)) < 0) { ! 72: (void) tsaplose (td, DR_CONGEST, "ioctl", "FIONBIO"); ! 73: (void) close_x25_socket (fd); ! 74: return NOTOK; ! 75: } ! 76: } ! 77: tb -> tb_fd = fd; ! 78: (void) XTService (tb); ! 79: ! 80: if (join_x25_server (fd, remote) == NOTOK) { ! 81: if (async) ! 82: switch (errno) { ! 83: case EINPROGRESS: ! 84: if (peers == NULL) { ! 85: peers = (struct NSAPaddr **) ! 86: calloc ((unsigned) getdtablesize (), ! 87: sizeof *peers); ! 88: if (peers == NULL) { ! 89: (void) tsaplose (td, DR_CONGEST, NULLCP, ! 90: "out of memory"); ! 91: (void) close_x25_socket (fd); ! 92: return (tb -> tb_fd = NOTOK); ! 93: } ! 94: ! 95: FD_ZERO (&inprogress); ! 96: } ! 97: if (peers[fd] == NULL ! 98: && (peers[fd] = (struct NSAPaddr *) ! 99: malloc (sizeof **peers)) ! 100: == NULL) { ! 101: (void) tsaplose (td, DR_CONGEST, NULLCP, ! 102: "out of memory"); ! 103: (void) close_x25_socket (fd); ! 104: return (tb -> tb_fd = NOTOK); ! 105: } ! 106: *(peers[fd]) = *remote; /* struct copy */ ! 107: FD_SET (fd, &inprogress); ! 108: return OK; ! 109: ! 110: case EISCONN: ! 111: goto done; ! 112: ! 113: default: ! 114: break; ! 115: } ! 116: ! 117: (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish"); ! 118: LLOG (x25_log, LLOG_NOTICE, ! 119: ("connection to %s failed", na2str (remote))); ! 120: (void) close_x25_socket (fd); ! 121: return (tb -> tb_fd = NOTOK); ! 122: } ! 123: done: ; ! 124: ! 125: if (async) ! 126: if (ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff)) < 0) { ! 127: (void) tsaplose (td, DR_CONGEST, "ioctl", "FIONBIO"); ! 128: (void) close_x25_socket (fd); ! 129: return NOTOK; ! 130: } ! 131: ! 132: (void) XTService (tb); /* in case pktsize changed... */ ! 133: LLOG (x25_log, LLOG_NOTICE, ! 134: ("connection %d to %s", fd, na2str (remote))); ! 135: ! 136: return DONE; ! 137: } ! 138: ! 139: /* */ ! 140: ! 141: static int x25retry (tb, td) ! 142: struct tsapblk *tb; ! 143: struct TSAPdisconnect *td; ! 144: { ! 145: int onoff; ! 146: int fd = tb -> tb_fd; ! 147: fd_set mask; ! 148: struct NSAPaddr *remote = peers[fd]; ! 149: ! 150: FD_ZERO (&mask); ! 151: FD_SET (fd, &mask); ! 152: if (xselect (fd + 1, NULLFD, &mask, NULLFD, 0) < 1) ! 153: return OK; ! 154: ! 155: if (!FD_ISSET (fd, &inprogress)) ! 156: return DONE; ! 157: ! 158: if (join_x25_server (fd, remote) == NOTOK) { ! 159: switch (errno) { ! 160: case EINPROGRESS: ! 161: return OK; ! 162: ! 163: case EISCONN: ! 164: goto done; ! 165: ! 166: case EINVAL: /* UNIX bug: could be any socket errno, e.g., ! 167: ETIMEDOUT */ ! 168: errno = ECONNREFUSED; ! 169: /* and fall */ ! 170: default: ! 171: break; ! 172: } ! 173: ! 174: (void) tsaplose (td, DR_REFUSED, "connection", "unable to establish"); ! 175: FD_CLR (fd, &inprogress); ! 176: (void) close_x25_socket (fd); ! 177: LLOG (x25_log, LLOG_NOTICE, ! 178: ("connection to %s failed", na2str (remote))); ! 179: return (tb -> tb_fd = NOTOK); ! 180: } ! 181: done: ; ! 182: ! 183: (void) ioctl (fd, FIONBIO, (onoff = 0, (char *) &onoff)); ! 184: FD_CLR (fd, &inprogress); ! 185: ! 186: (void) XTService (tb); /* in case pktsize changed... */ ! 187: LLOG (x25_log, LLOG_NOTICE, ! 188: ("connection %d to %s", fd, na2str (remote))); ! 189: ! 190: return DONE; ! 191: } ! 192: ! 193: /* init for read from network */ ! 194: ! 195: static char nsdu[MAXNSDU]; ! 196: static char *np; ! 197: static int bl; ! 198: ! 199: ! 200: static int x25init (fd, t) ! 201: int fd; ! 202: register struct tsapkt *t; ! 203: { ! 204: register int cc; ! 205: ! 206: /* XXX: cc should be set to the maximum acceptable NSDU length. ! 207: Longer NSDUs will be truncated without notification. ! 208: Should be configurable (or set during N-CONNECT and remembered) */ ! 209: ! 210: cc = sizeof nsdu; ! 211: ! 212: switch (cc = read_x25_socket (fd, nsdu, cc)) { ! 213: case OK: /* no data ? */ ! 214: case NOTOK: ! 215: #ifdef SUN_X25 ! 216: if (compat_log -> ll_events & LLOG_EXCEPTIONS) ! 217: (void) log_cause_and_diag(fd); ! 218: #endif ! 219: return DR_NETWORK; ! 220: ! 221: default: ! 222: t -> t_length = cc + sizeof t -> t_pkthdr; ! 223: break; ! 224: } ! 225: ! 226: if (t -> t_length < TPKT_HDRLEN (t)) ! 227: return DR_LENGTH; ! 228: ! 229: t -> t_li = nsdu[0]; ! 230: t -> t_code = nsdu[1]; ! 231: ! 232: np = nsdu + 2; ! 233: bl = t -> t_length - TPKT_HDRLEN (t); ! 234: ! 235: t -> t_vrsn = TPKT_VRSN; /* Not really needed! */ ! 236: ! 237: return OK; ! 238: } ! 239: ! 240: ! 241: /* ARGSUSED */ ! 242: ! 243: static int read_nsdu_buffer (fd, buffer, cc) ! 244: int fd; ! 245: register char *buffer; ! 246: register int cc; ! 247: { ! 248: if (cc > bl) ! 249: cc = bl; ! 250: ! 251: if (cc > 0) { ! 252: bcopy (np, buffer, cc); ! 253: np += cc, bl -= cc; ! 254: } ! 255: ! 256: return cc; ! 257: } ! 258: ! 259: /* */ ! 260: ! 261: /* ARGSUSED */ ! 262: ! 263: char *x25save (fd, dte1, l1, dte2, l2, td) ! 264: int fd; ! 265: char *dte1; ! 266: int l1; ! 267: char *dte2; ! 268: int l2; ! 269: struct TSAPdisconnect *td; ! 270: { ! 271: static char buffer[BUFSIZ]; ! 272: ! 273: (void) sprintf (buffer, "%c%d %*s %*s", ! 274: NT_X25, fd, l1, dte1, l2, dte2); ! 275: ! 276: return buffer; ! 277: } ! 278: ! 279: ! 280: int x25restore (tb, buffer, td) ! 281: register struct tsapblk *tb; ! 282: char *buffer; ! 283: struct TSAPdisconnect *td; ! 284: { ! 285: int fd; ! 286: char dte1[NSAP_DTELEN + 1], ! 287: dte2[NSAP_DTELEN + 1]; ! 288: register struct NSAPaddr *na; ! 289: register struct tsapADDR *ta; ! 290: ! 291: if (sscanf (buffer, "%d %s %s", &fd, dte1, dte2) != 3 || fd < 0) ! 292: return tsaplose (td, DR_PARAMETER, NULLCP, ! 293: "bad initialization vector \"%s\"", buffer); ! 294: ! 295: ta = &tb -> tb_initiating; ! 296: ta -> ta_present = 1; ! 297: na = &ta -> ta_addr; ! 298: na -> na_stack = NA_X25; ! 299: na -> na_community = ts_comm_x25_default; ! 300: bcopy(dte1, na -> na_dte, strlen(dte1)); ! 301: na -> na_dtelen = strlen (na -> na_dte); ! 302: ! 303: tb -> tb_fd = fd; ! 304: (void) XTService (tb); ! 305: ! 306: ta = &tb -> tb_responding; ! 307: ta -> ta_present = 1; ! 308: na = &ta -> ta_addr; ! 309: na -> na_stack = NA_X25; ! 310: na -> na_community = ts_comm_x25_default; ! 311: bcopy(dte2, na -> na_dte, strlen(dte2)); ! 312: na -> na_dtelen = strlen (na -> na_dte); ! 313: ! 314: #ifdef SUN_X25 ! 315: (void) set_x25_facilities (tb -> tb_fd, -1, "Negotiated"); ! 316: #endif ! 317: ! 318: return OK; ! 319: } ! 320: ! 321: /* */ ! 322: ! 323: int XTService (tb) ! 324: register struct tsapblk *tb; ! 325: { ! 326: #ifndef UBC_X25 ! 327: int maxnsdu = MAXNSDU; ! 328: #else ! 329: int maxnsdu = X25_PACKETSIZE; ! 330: #endif ! 331: ! 332: tb -> tb_flags |= TB_X25; ! 333: ! 334: #ifdef notyet ! 335: if (recvpktsize > DT_MAGIC && recvpktsize < maxnsdu) ! 336: maxnsdu = recvpktsize; ! 337: if (sendpktsize > DT_MAGIC && sendpktsize < maxnsdu) ! 338: maxnsdu = sendpktsize; ! 339: #endif ! 340: tb -> tb_tsdusize = maxnsdu - (tb -> tb_tpduslop = DT_MAGIC); ! 341: ! 342: tb -> tb_retryfnx = x25retry; ! 343: ! 344: tb -> tb_initfnx = x25init; ! 345: tb -> tb_readfnx = read_nsdu_buffer; ! 346: tb -> tb_writefnx = tp0write; ! 347: tb -> tb_closefnx = close_x25_socket; ! 348: tb -> tb_selectfnx = select_x25_socket; ! 349: ! 350: tp0init (tb); ! 351: } ! 352: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.