aboutsummaryrefslogtreecommitdiff
path: root/sys/netccitt/pk_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netccitt/pk_subr.c')
-rw-r--r--sys/netccitt/pk_subr.c215
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);
-}