diff options
Diffstat (limited to 'sys/netccitt/pk_subr.c')
| -rw-r--r-- | sys/netccitt/pk_subr.c | 215 |
1 files changed, 94 insertions, 121 deletions
diff --git a/sys/netccitt/pk_subr.c b/sys/netccitt/pk_subr.c index 6b4c98772e88..f8da003dc027 100644 --- a/sys/netccitt/pk_subr.c +++ b/sys/netccitt/pk_subr.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * from: @(#)pk_subr.c 7.16 (Berkeley) 6/6/91 - * $Id: pk_subr.c,v 1.2 1993/10/16 19:46:53 rgrimes Exp $ + * $Id: pk_subr.c,v 1.5 1993/12/19 00:52:20 wollman Exp $ */ #include "param.h" @@ -48,6 +48,7 @@ #include "errno.h" #include "time.h" #include "kernel.h" +#include "machine/stdarg.h" #include "../net/if.h" @@ -74,7 +75,6 @@ struct socket *so; { register struct pklcd *lcp; register int error = ENOBUFS; - int pk_output(); MALLOC(lcp, struct pklcd *, sizeof (*lcp), M_PCB, M_NOWAIT); if (lcp) { @@ -101,8 +101,9 @@ struct socket *so; * Disconnect X.25 protocol from socket. */ +void pk_disconnect (lcp) -register struct pklcd *lcp; + register struct pklcd *lcp; { register struct socket *so = lcp -> lcd_so; register struct pklcd *l, *p; @@ -145,8 +146,9 @@ register struct pklcd *lcp; * connection and internal descriptors. Wake up any sleepers. */ +void pk_close (lcp) -struct pklcd *lcp; + struct pklcd *lcp; { register struct socket *so = lcp -> lcd_so; @@ -157,7 +159,7 @@ struct pklcd *lcp; so -> so_pcb = 0; soisdisconnected (so); - /* sofree (so); /* gak!!! you can't do that here */ + /* sofree (so);*/ /* gak!!! you can't do that here */ } /* @@ -206,9 +208,10 @@ int lcn, type; * state. */ +void pk_restart (pkp, restart_cause) -register struct pkcb *pkp; -int restart_cause; + register struct pkcb *pkp; + int restart_cause; { register struct mbuf *m; register struct pklcd *lcp; @@ -239,7 +242,7 @@ int restart_cause; m -> m_pkthdr.len = m -> m_len += 2; mtod (m, struct x25_packet *) -> packet_data = 0; /* DTE only */ mtod (m, octet *)[4] = restart_cause; - pk_output (lcp); + pk_output (lcp, 0); } @@ -247,8 +250,9 @@ int restart_cause; * This procedure frees up the Logical Channel Descripter. */ +void pk_freelcd (lcp) -register struct pklcd *lcp; + register struct pklcd *lcp; { if (lcp == NULL) return; @@ -268,9 +272,10 @@ register struct pklcd *lcp; * Call User Data field. */ +int pk_bind (lcp, nam) -struct pklcd *lcp; -struct mbuf *nam; + struct pklcd *lcp; + struct mbuf *nam; { register struct pkcb *pkp; register struct pklcd *pp; @@ -316,8 +321,9 @@ struct mbuf *nam; /* * Include a bound control block in the list of listeners. */ +int pk_listen (lcp) -register struct pklcd *lcp; + register struct pklcd *lcp; { register struct pklcd **pp; @@ -341,8 +347,11 @@ register struct pklcd *lcp; /* * Include a listening control block for the benefit of other protocols. */ +int pk_protolisten (spi, spilen, callee) -int (*callee) (); + int spi; + int spilen; + void (*callee) (); { register struct pklcd *lcp = pk_attach ((struct socket *)0); register struct mbuf *nam; @@ -375,10 +384,11 @@ int (*callee) (); * by the remote DTE. */ +void pk_assoc (pkp, lcp, sa) -register struct pkcb *pkp; -register struct pklcd *lcp; -register struct sockaddr_x25 *sa; + register struct pkcb *pkp; + register struct pklcd *lcp; + register struct sockaddr_x25 *sa; { lcp -> lcd_pkp = pkp; @@ -400,11 +410,12 @@ register struct sockaddr_x25 *sa; lcp -> lcd_stime = time.tv_sec; } +int pk_connect (lcp, sa) -register struct pklcd *lcp; -register struct sockaddr_x25 *sa; + register struct pklcd *lcp; + register struct sockaddr_x25 *sa; { - register struct pkcb *pkp; + register struct pkcb *pkp = 0; if (sa -> x25_addr[0] == '\0') return (EDESTADDRREQ); @@ -449,10 +460,11 @@ struct bcdinfo { * address, facilities fields and the user data field. */ +void pk_callrequest (lcp, sa, xcp) -struct pklcd *lcp; -register struct sockaddr_x25 *sa; -register struct x25config *xcp; + struct pklcd *lcp; + register struct sockaddr_x25 *sa; + register struct x25config *xcp; { register struct x25_calladdr *a; register struct mbuf *m = lcp -> lcd_template; @@ -480,9 +492,11 @@ register struct x25config *xcp; m_copyback (m, m -> m_pkthdr.len, sa -> x25_udlen, sa -> x25_udata); } +void pk_build_facilities (m, sa, type) -register struct mbuf *m; -struct sockaddr_x25 *sa; + register struct mbuf *m; + struct sockaddr_x25 *sa; + int type; { register octet *cp; register octet *fcp; @@ -516,10 +530,11 @@ struct sockaddr_x25 *sa; m -> m_pkthdr.len = (m -> m_len += *cp + 1); } +int to_bcd (b, sa, xcp) -register struct bcdinfo *b; -struct sockaddr_x25 *sa; -register struct x25config *xcp; + register struct bcdinfo *b; + struct sockaddr_x25 *sa; + register struct x25config *xcp; { register char *x = sa -> x25_addr; unsigned start = b -> posn; @@ -558,8 +573,9 @@ register struct x25config *xcp; * search is from the highest number to lowest number (DTE). */ +int pk_getlcn (pkp) -register struct pkcb *pkp; + register struct pkcb *pkp; { register int i; @@ -576,9 +592,11 @@ register struct pkcb *pkp; * This procedure sends a CLEAR request packet. The lc state is * set to "SENT_CLEAR". */ - +void pk_clear (lcp, diagnostic, abortive) -register struct pklcd *lcp; + register struct pklcd *lcp; + int diagnostic; + int abortive; { register struct mbuf *m = pk_template (lcp -> lcd_lcn, X25_CLEAR); @@ -597,7 +615,7 @@ register struct pklcd *lcp; struct sockbuf *sb = so ? & so -> so_snd : & lcp -> lcd_sb; sbappendrecord (sb, m); } - pk_output (lcp); + pk_output (lcp, 0); } @@ -606,8 +624,11 @@ register struct pklcd *lcp; * inward data flow, if the current state changes (blocked ==> open or * vice versa), or if forced to generate one. One forces RNR's to ack data. */ +void pk_flowcontrol (lcp, inhibit, forced) -register struct pklcd *lcp; + register struct pklcd *lcp; + int inhibit; + int forced; { inhibit = (inhibit != 0); if (lcp == 0 || lcp -> lcd_state != DATA_TRANSFER || @@ -616,7 +637,7 @@ register struct pklcd *lcp; lcp -> lcd_rxrnr_condition = inhibit; lcp -> lcd_template = pk_template (lcp -> lcd_lcn, inhibit ? X25_RNR : X25_RR); - pk_output (lcp); + pk_output (lcp, 0); } /* @@ -624,9 +645,10 @@ register struct pklcd *lcp; * virtual circuit. */ -static +static void pk_reset (lcp, diagnostic) -register struct pklcd *lcp; + register struct pklcd *lcp; + int diagnostic; { register struct mbuf *m; register struct socket *so = lcp -> lcd_so; @@ -650,7 +672,7 @@ register struct pklcd *lcp; m -> m_pkthdr.len = m -> m_len += 2; mtod (m, struct x25_packet *) -> packet_data = 0; mtod (m, octet *)[4] = diagnostic; - pk_output (lcp); + pk_output (lcp, 0); } @@ -659,8 +681,9 @@ register struct pklcd *lcp; * virtual circuit. */ +void pk_flush (lcp) -register struct pklcd *lcp; + register struct pklcd *lcp; { register struct socket *so; @@ -685,10 +708,12 @@ register struct pklcd *lcp; /* * This procedure handles all local protocol procedure errors. */ - +void pk_procerror (error, lcp, errstr, diagnostic) -register struct pklcd *lcp; -char *errstr; + int error; + register struct pklcd *lcp; + const char *errstr; + int diagnostic; { pk_message (lcp -> lcd_lcn, lcp -> lcd_pkp -> pk_xcp, errstr); @@ -712,10 +737,10 @@ char *errstr; * and process the P(R) values received in the DATA, RR OR RNR * packets. */ - +int pk_ack (lcp, pr) -struct pklcd *lcp; -unsigned pr; + struct pklcd *lcp; + unsigned pr; { register struct socket *so = lcp -> lcd_so; @@ -750,9 +775,9 @@ unsigned pr; * This procedure decodes the X.25 level 3 packet returning a * code to be used in switchs or arrays. */ - +int pk_decode (xp) -register struct x25_packet *xp; + register struct x25_packet *xp; { register int type; @@ -843,10 +868,10 @@ register struct x25_packet *xp; * A restart packet has been received. Print out the reason * for the restart. */ - +void pk_restartcause (pkp, xp) -struct pkcb *pkp; -register struct x25_packet *xp; + struct pkcb *pkp; + register struct x25_packet *xp; { register struct x25config *xcp = pkp -> pk_xcp; register int lcn = LCN(xp); @@ -878,10 +903,10 @@ int Reset_cause[] = { /* * A reset packet has arrived. Return the cause to the user. */ - +void pk_resetcause (pkp, xp) -struct pkcb *pkp; -register struct x25_packet *xp; + struct pkcb *pkp; + register struct x25_packet *xp; { register struct pklcd *lcp = pkp -> pk_chan[LCN(xp)]; @@ -890,8 +915,9 @@ register struct x25_packet *xp; if (code > MAXRESETCAUSE) code = 7; /* EXRNCG */ - pk_message(LCN(xp), lcp -> lcd_pkp, "reset code 0x%x, diagnostic 0x%x", - xp -> packet_data, 4[(u_char *)xp]); + pk_message(LCN(xp), (struct x25config *)lcp -> lcd_pkp, + "reset code 0x%x, diagnostic 0x%x", + xp -> packet_data, 4[(u_char *)xp]); if (lcp -> lcd_so) lcp -> lcd_so -> so_error = Reset_cause[code]; @@ -908,10 +934,10 @@ int Clear_cause[] = { /* * A clear packet has arrived. Return the cause to the user. */ - +void pk_clearcause (pkp, xp) -struct pkcb *pkp; -register struct x25_packet *xp; + struct pkcb *pkp; + register struct x25_packet *xp; { register struct pklcd *lcp = pkp -> pk_chan[LCN(xp)]; @@ -932,10 +958,11 @@ register struct x25config *xcp; } /* VARARGS1 */ -pk_message (lcn, xcp, fmt, a1, a2, a3, a4, a5, a6) -struct x25config *xcp; -char *fmt; +void +pk_message (int lcn, struct x25config *xcp, const char *fmt, ...) { + va_list args; + va_start(args, fmt); if (lcn) if (pkcbhead -> pk_next) @@ -948,13 +975,17 @@ char *fmt; else printf ("X.25: "); - printf (fmt, a1, a2, a3, a4, a5, a6); - printf ("\n"); + printf ("%r\n", fmt, args); + va_end(args); } +int pk_fragment (lcp, m0, qbit, mbit, wait) -struct mbuf *m0; -register struct pklcd *lcp; + register struct pklcd *lcp; + struct mbuf *m0; + int qbit; + int mbit; + int wait; { register struct mbuf *m = m0; register struct x25_packet *xp; @@ -1013,61 +1044,3 @@ abort: return ENOBUFS; } -struct mbuf * -m_split (m0, len0, wait) -register struct mbuf *m0; -int len0; -{ - register struct mbuf *m, *n; - unsigned len = len0, remain; - - for (m = m0; m && len > m -> m_len; m = m -> m_next) - len -= m -> m_len; - if (m == 0) - return (0); - remain = m -> m_len - len; - if (m0 -> m_flags & M_PKTHDR) { - MGETHDR(n, wait, m0 -> m_type); - if (n == 0) - return (0); - n -> m_pkthdr.rcvif = m0 -> m_pkthdr.rcvif; - n -> m_pkthdr.len = m0 -> m_pkthdr.len - len0; - m0 -> m_pkthdr.len = len0; - if (m -> m_flags & M_EXT) - goto extpacket; - if (remain > MHLEN) { - /* m can't be the lead packet */ - MH_ALIGN(n, 0); - n -> m_next = m_split (m, len, wait); - if (n -> m_next == 0) { - (void) m_free (n); - return (0); - } else - return (n); - } else - MH_ALIGN(n, remain); - } else if (remain == 0) { - n = m -> m_next; - m -> m_next = 0; - return (n); - } else { - MGET(n, wait, m -> m_type); - if (n == 0) - return (0); - M_ALIGN(n, remain); - } -extpacket: - if (m -> m_flags & M_EXT) { - n -> m_flags |= M_EXT; - n -> m_ext = m -> m_ext; - mclrefcnt[mtocl (m -> m_ext.ext_buf)]++; - n -> m_data = m -> m_data + len; - } else { - bcopy (mtod (m, caddr_t) + len, mtod (n, caddr_t), remain); - } - n -> m_len = remain; - m -> m_len = len; - n -> m_next = m -> m_next; - m -> m_next = 0; - return (n); -} |
