141709Ssklower /* 241709Ssklower * Copyright (c) University of British Columbia, 1984 341709Ssklower * Copyright (c) 1990 The Regents of the University of California. 441709Ssklower * All rights reserved. 541709Ssklower * 641709Ssklower * This code is derived from software contributed to Berkeley by 741709Ssklower * the Laboratory for Computation Vision and the Computer Science Department 841709Ssklower * of the University of British Columbia. 941709Ssklower * 1041709Ssklower * %sccs.include.redist.c% 1141709Ssklower * 12*56530Sbostic * @(#)pk_debug.c 7.9 (Berkeley) 10/11/92 1341709Ssklower */ 1441591Ssklower 15*56530Sbostic #include <sys/param.h> 16*56530Sbostic #include <sys/systm.h> 17*56530Sbostic #include <sys/mbuf.h> 18*56530Sbostic #include <sys/socket.h> 19*56530Sbostic #include <sys/protosw.h> 20*56530Sbostic #include <sys/socketvar.h> 21*56530Sbostic #include <sys/errno.h> 2241591Ssklower 23*56530Sbostic #include <net/if.h> 2441591Ssklower 25*56530Sbostic #include <netccitt/x25.h> 26*56530Sbostic #include <netccitt/pk.h> 27*56530Sbostic #include <netccitt/pk_var.h> 2845165Ssklower 2941591Ssklower char *pk_state[] = { 3041591Ssklower "Listen", "Ready", "Received-Call", 3141591Ssklower "Sent-Call", "Data-Transfer","Received-Clear", 3241591Ssklower "Sent-Clear", 3341591Ssklower }; 3441591Ssklower 3541591Ssklower char *pk_name[] = { 3641591Ssklower "Call", "Call-Conf", "Clear", 3741591Ssklower "Clear-Conf", "Data", "Intr", "Intr-Conf", 3841591Ssklower "Rr", "Rnr", "Reset", "Reset-Conf", 3947267Ssklower "Restart", "Restart-Conf", "Reject", "Diagnostic", 4047267Ssklower "Invalid" 4141591Ssklower }; 4241591Ssklower 4345893Ssklower pk_trace (xcp, m, dir) 4441591Ssklower struct x25config *xcp; 4545893Ssklower register struct mbuf *m; 4641591Ssklower char *dir; 4741591Ssklower { 4841591Ssklower register char *s; 4945893Ssklower struct x25_packet *xp = mtod(m, struct x25_packet *); 5041591Ssklower register int i, len = 0, cnt = 0; 5141591Ssklower 5241591Ssklower if (xcp -> xc_ptrace == 0) 5341591Ssklower return; 5441591Ssklower 5541591Ssklower i = pk_decode (xp) / MAXSTATES; 5645893Ssklower for (; m; m = m -> m_next) { 5741591Ssklower len = len + m -> m_len; 5841591Ssklower ++cnt; 5941591Ssklower } 6041591Ssklower printf ("LCN=%d %s: %s #=%d, len=%d ", 6145571Ssklower LCN(xp), dir, pk_name[i], cnt, len); 6241591Ssklower for (s = (char *) xp, i = 0; i < 5; ++i, ++s) 6341591Ssklower printf ("%x ", (int) * s & 0xff); 6441591Ssklower printf ("\n"); 6541591Ssklower } 6649590Ssklower 6749590Ssklower mbuf_cache(c, m) 6849590Ssklower register struct mbuf_cache *c; 6949590Ssklower struct mbuf *m; 7049590Ssklower { 7149590Ssklower register struct mbuf **mp; 7249590Ssklower 7349590Ssklower if (c->mbc_size != c->mbc_oldsize) { 7449590Ssklower unsigned zero_size, copy_size; 7549590Ssklower unsigned new_size = c->mbc_size * sizeof(m); 7649590Ssklower caddr_t cache = (caddr_t)c->mbc_cache; 7749590Ssklower 7849590Ssklower if (new_size) { 7949590Ssklower c->mbc_cache = (struct mbuf **) 8049590Ssklower malloc(new_size, M_MBUF, M_NOWAIT); 8149590Ssklower if (c->mbc_cache == 0) { 8249590Ssklower c->mbc_cache = (struct mbuf **)cache; 8349590Ssklower return; 8449590Ssklower } 8549590Ssklower c->mbc_num %= c->mbc_size; 8649590Ssklower } else 8749590Ssklower c->mbc_cache = 0; 8849590Ssklower if (c->mbc_size < c->mbc_oldsize) { 8949590Ssklower register struct mbuf **mplim; 9049590Ssklower mp = c->mbc_size + (struct mbuf **)cache; 9149590Ssklower mplim = c->mbc_oldsize + (struct mbuf **)cache; 9249590Ssklower while (mp < mplim) 9349590Ssklower m_freem(*mp++); 9449590Ssklower zero_size = 0; 9549590Ssklower } else 9649590Ssklower zero_size = (c->mbc_size - c->mbc_oldsize) * sizeof(m); 9749590Ssklower copy_size = new_size - zero_size; 9849590Ssklower c->mbc_oldsize = c->mbc_size; 9949590Ssklower if (copy_size) 10049590Ssklower bcopy(cache, (caddr_t)c->mbc_cache, copy_size); 10149590Ssklower if (cache) 10249590Ssklower free(cache, M_MBUF); 10349590Ssklower if (zero_size) 10449590Ssklower bzero(copy_size + (caddr_t)c->mbc_cache, zero_size); 10549590Ssklower } 10649590Ssklower if (c->mbc_size == 0) 10749590Ssklower return; 10849590Ssklower mp = c->mbc_cache + c->mbc_num; 10949590Ssklower c->mbc_num = (1 + c->mbc_num) % c->mbc_size; 11049590Ssklower if (*mp) 11149590Ssklower m_freem(*mp); 11250427Ssklower if (*mp = m_copym(m, 0, M_COPYALL, M_DONTWAIT)) 11350427Ssklower (*mp)->m_flags |= m->m_flags & 0x08; 11449590Ssklower } 115