157022Ssklower /* 257022Ssklower * Copyright (c) Computing Centre, University of British Columbia, 1985 357022Ssklower * Copyright (C) Computer Science Department IV, 457022Ssklower * University of Erlangen-Nuremberg, Germany, 1990, 1991, 1992 5*63216Sbostic * Copyright (c) 1992, 1993 6*63216Sbostic * The Regents of the University of California. All rights reserved. 757022Ssklower * 857022Ssklower * This code is derived from software contributed to Berkeley by the 957022Ssklower * Laboratory for Computation Vision and the Computer Science Department 1057022Ssklower * of the the University of British Columbia and the Computer Science 1157022Ssklower * Department (IV) of the University of Erlangen-Nuremberg, Germany. 1241935Ssklower * 1341935Ssklower * %sccs.include.redist.c% 1441935Ssklower * 15*63216Sbostic * @(#)pk_var.h 8.1 (Berkeley) 06/10/93 1641935Ssklower */ 1741595Ssklower 1841595Ssklower /* 1941595Ssklower * 2041595Ssklower * X.25 Logical Channel Descriptor 2141595Ssklower * 2241595Ssklower */ 2341595Ssklower 2441595Ssklower struct pklcd { 2547265Ssklower struct pklcd_q { 2647265Ssklower struct pklcd_q *q_forw; /* debugging chain */ 2747265Ssklower struct pklcd_q *q_back; /* debugging chain */ 2847265Ssklower } lcd_q; 2943362Ssklower int (*lcd_upper)(); /* switch to socket vs datagram vs ...*/ 3043362Ssklower caddr_t lcd_upnext; /* reference for lcd_upper() */ 3147265Ssklower int (*lcd_send)(); /* if X.25 front end, direct connect */ 3247265Ssklower caddr_t lcd_downnext; /* reference for lcd_send() */ 3341595Ssklower short lcd_lcn; /* Logical channel number */ 3441595Ssklower short lcd_state; /* Logical Channel state */ 3547265Ssklower short lcd_timer; /* Various timer values */ 3647265Ssklower short lcd_dg_timer; /* to reclaim idle datagram circuits */ 3741595Ssklower bool lcd_intrconf_pending; /* Interrupt confirmation pending */ 3841595Ssklower octet lcd_intrdata; /* Octet of incoming intr data */ 3941595Ssklower char lcd_retry; /* Timer retry count */ 4041595Ssklower char lcd_rsn; /* Seq no of last received packet */ 4141595Ssklower char lcd_ssn; /* Seq no of next packet to send */ 4241595Ssklower char lcd_output_window; /* Output flow control window */ 4341595Ssklower char lcd_input_window; /* Input flow control window */ 4441595Ssklower char lcd_last_transmitted_pr;/* Last Pr value transmitted */ 4541595Ssklower bool lcd_rnr_condition; /* Remote in busy condition */ 4641595Ssklower bool lcd_window_condition; /* Output window size exceeded */ 4741595Ssklower bool lcd_reset_condition; /* True, if waiting reset confirm */ 4847265Ssklower bool lcd_rxrnr_condition; /* True, if we have sent rnr */ 4941595Ssklower char lcd_packetsize; /* Maximum packet size */ 5041595Ssklower char lcd_windowsize; /* Window size - both directions */ 5141595Ssklower octet lcd_closed_user_group; /* Closed user group specification */ 5241595Ssklower char lcd_flags; /* copy of sockaddr_x25 op_flags */ 5347265Ssklower struct mbuf *lcd_facilities; /* user supplied facilities for cr */ 5445892Ssklower struct mbuf *lcd_template; /* Address of response packet */ 5541595Ssklower struct socket *lcd_so; /* Socket addr for connection */ 5642277Ssklower struct sockaddr_x25 *lcd_craddr;/* Calling address pointer */ 5742277Ssklower struct sockaddr_x25 *lcd_ceaddr;/* Called address pointer */ 5841595Ssklower time_t lcd_stime; /* time circuit established */ 5941595Ssklower long lcd_txcnt; /* Data packet transmit count */ 6041595Ssklower long lcd_rxcnt; /* Data packet receive count */ 6141595Ssklower short lcd_intrcnt; /* Interrupt packet transmit count */ 6241595Ssklower struct pklcd *lcd_listen; /* Next lcd on listen queue */ 6342277Ssklower struct pkcb *lcd_pkp; /* Network this lcd is attached to */ 6445892Ssklower struct mbuf *lcd_cps; /* Complete Packet Sequence reassembly*/ 6545892Ssklower long lcd_cpsmax; /* Max length for CPS */ 6645165Ssklower struct sockaddr_x25 lcd_faddr; /* Remote Address (Calling) */ 6745165Ssklower struct sockaddr_x25 lcd_laddr; /* Local Address (Called) */ 6843362Ssklower struct sockbuf lcd_sb; /* alternate for datagram service */ 6941595Ssklower }; 7041595Ssklower 7141595Ssklower /* 7242140Ssklower * Per network information, allocated dynamically 7342140Ssklower * when a new network is configured. 7442140Ssklower */ 7542140Ssklower 7642140Ssklower struct pkcb { 7757022Ssklower struct pkcb_q { 7857022Ssklower struct pkcb_q *q_forw; 7957022Ssklower struct pkcb_q *q_backw; 8057022Ssklower } pk_q; 8149935Ssklower short pk_state; /* packet level status */ 8249935Ssklower short pk_maxlcn; /* local copy of xc_maxlcn */ 8342277Ssklower int (*pk_lloutput) (); /* link level output procedure */ 8457022Ssklower caddr_t (*pk_llctlinput) (); /* link level ctloutput procedure */ 8543362Ssklower caddr_t pk_llnext; /* handle for next level down */ 8642277Ssklower struct x25config *pk_xcp; /* network specific configuration */ 8749935Ssklower struct x25_ifaddr *pk_ia; /* backpointer to ifaddr */ 8842140Ssklower struct pklcd **pk_chan; /* actual size == xc_maxlcn+1 */ 8957022Ssklower short pk_dxerole; /* DXE role of PLE over LLC2 */ 9057022Ssklower short pk_restartcolls; /* counting RESTART collisions til resolved */ 9157022Ssklower struct rtentry *pk_rt; /* back pointer to route */ 9257022Ssklower struct rtentry *pk_llrt; /* pointer to reverse mapping */ 9357022Ssklower u_short pk_refcount; /* ref count */ 9442140Ssklower }; 9557022Ssklower 9657022Ssklower #define FOR_ALL_PKCBS(p) for((p) = (struct pkcb *)(pkcb_q.q_forw); \ 9757022Ssklower (pkcb_q.q_forw != &pkcb_q) && ((struct pkcb_q *)(p) != &pkcb_q); \ 9857022Ssklower (p) = (struct pkcb *)((p) -> pk_q.q_forw)) 9957022Ssklower 10057022Ssklower #define PQEMPTY (pkcb_q.q_forw == &pkcb_q) 10157022Ssklower 10242140Ssklower /* 10341935Ssklower * Interface address, x25 version. Exactly one of these structures is 10441935Ssklower * allocated for each interface with an x25 address. 10541935Ssklower * 10641935Ssklower * The ifaddr structure conatins the protocol-independent part 10741935Ssklower * of the structure, and is assumed to be first. 10841595Ssklower */ 10941935Ssklower struct x25_ifaddr { 11041935Ssklower struct ifaddr ia_ifa; /* protocol-independent info */ 11149935Ssklower #define ia_ifp ia_ifa.ifa_ifp 11249935Ssklower #define ia_flags ia_ifa.ifa_flags 11349935Ssklower struct x25config ia_xc; /* network specific configuration */ 11457022Ssklower struct pkcb *ia_pkcb; 11549935Ssklower #define ia_maxlcn ia_xc.xc_maxlcn 11649935Ssklower int (*ia_start) (); /* connect, confirm method */ 11749935Ssklower struct sockaddr_x25 ia_dstaddr; /* reserve space for route dst */ 11841935Ssklower }; 11941595Ssklower 12041935Ssklower /* 12141935Ssklower * ``Link-Level'' extension to Routing Entry for upper level 12241935Ssklower * packet switching via X.25 virtual circuits. 12341935Ssklower */ 12445165Ssklower struct llinfo_x25 { 12545297Ssklower struct llinfo_x25 *lx_next; /* chain together in linked list */ 12645297Ssklower struct llinfo_x25 *lx_prev; /* chain together in linked list */ 12745297Ssklower struct rtentry *lx_rt; /* back pointer to route */ 12845165Ssklower struct pklcd *lx_lcd; /* local connection block */ 12945165Ssklower struct x25_ifaddr *lx_ia; /* may not be same as rt_ifa */ 13045165Ssklower int lx_state; /* can't trust lcd->lcd_state */ 13145165Ssklower int lx_flags; 13245165Ssklower int lx_timer; /* for idle timeout */ 13345297Ssklower int lx_family; /* for dispatch */ 13441595Ssklower }; 13541595Ssklower 13645165Ssklower /* States for lx_state */ 13745165Ssklower #define LXS_NEWBORN 0 13845165Ssklower #define LXS_RESOLVING 1 13945165Ssklower #define LXS_FREE 2 14049935Ssklower #define LXS_CONNECTING 3 14149935Ssklower #define LXS_CONNECTED 4 14245165Ssklower #define LXS_DISCONNECTING 5 14345297Ssklower #define LXS_LISTENING 6 14442140Ssklower 14542140Ssklower /* flags */ 14645165Ssklower #define LXF_VALID 0x1 /* Circuit is live, etc. */ 14745165Ssklower #define LXF_RTHELD 0x2 /* this lcb references rtentry */ 14845297Ssklower #define LXF_LISTEN 0x4 /* accepting incoming calls */ 14942140Ssklower 15049588Ssklower /* 15157022Ssklower * Definitions for accessing bitfields/bitslices inside X.25 structs 15257022Ssklower */ 15357022Ssklower 15457022Ssklower 15557022Ssklower struct x25bitslice { 15657022Ssklower unsigned int bs_mask; 15757022Ssklower unsigned int bs_shift; 15857022Ssklower }; 15957022Ssklower 16057022Ssklower #define calling_addrlen 0 16157022Ssklower #define called_addrlen 1 16257022Ssklower #define q_bit 2 16357022Ssklower #define d_bit 3 16457022Ssklower #define fmt_identifier 4 16557022Ssklower #define lc_group_number 1 16657022Ssklower #define p_r 5 16757022Ssklower #define m_bit 6 16857022Ssklower #define p_s 7 16957022Ssklower #define zilch 8 17057022Ssklower 17157022Ssklower #define X25GBITS(Arg, Index) (((Arg) & x25_bitslice[(Index)].bs_mask) >> x25_bitslice[(Index)].bs_shift) 17257022Ssklower #define X25SBITS(Arg, Index, Val) (Arg) |= (((Val) << x25_bitslice[(Index)].bs_shift) & x25_bitslice[(Index)].bs_mask) 17357022Ssklower #define X25CSBITS(Arg, Index, Val) (Arg) = (((Val) << x25_bitslice[(Index)].bs_shift) & x25_bitslice[(Index)].bs_mask) 17457022Ssklower 17557022Ssklower extern struct x25bitslice x25_bitslice[]; 17657022Ssklower 17757022Ssklower 17857022Ssklower #define ISOFIFTTYPE(i,t) ((i)->if_type == (t)) 17957022Ssklower #define ISISO8802(i) ((ISOFIFTTYPE(i, IFT_ETHER) || \ 18057022Ssklower ISOFIFTTYPE(i, IFT_ISO88023) || \ 18157022Ssklower ISOFIFTTYPE(i, IFT_ISO88024) || \ 18257022Ssklower ISOFIFTTYPE(i, IFT_ISO88025) || \ 18357022Ssklower ISOFIFTTYPE(i, IFT_ISO88026) || \ 18457022Ssklower ISOFIFTTYPE(i, IFT_P10) || \ 18557022Ssklower ISOFIFTTYPE(i, IFT_P80) || \ 18657022Ssklower ISOFIFTTYPE(i, IFT_FDDI))) 18757022Ssklower 18857022Ssklower /* 18949588Ssklower * miscellenous debugging info 19049588Ssklower */ 19149588Ssklower struct mbuf_cache { 19249588Ssklower int mbc_size; 19349588Ssklower int mbc_num; 19449588Ssklower int mbc_oldsize; 19549588Ssklower struct mbuf **mbc_cache; 19649588Ssklower }; 19749588Ssklower 19847265Ssklower #if defined(KERNEL) && defined(CCITT) 19957022Ssklower extern struct pkcb_q pkcb_q; 20041595Ssklower struct pklcd *pk_listenhead; 20142277Ssklower struct pklcd *pk_attach(); 20241595Ssklower 20347265Ssklower extern char *pk_name[], *pk_state[]; 20441595Ssklower int pk_t20, pk_t21, pk_t22, pk_t23; 20541595Ssklower #endif 206