diff options
author | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-03-04 07:36:50 +0000 |
---|---|---|
committer | Niklas Hallqvist <niklas@cvs.openbsd.org> | 1996-03-04 07:36:50 +0000 |
commit | adf1528ae6bd8dbe337c45c0a67cac4d76b1635f (patch) | |
tree | 3f8888e07b4ddaf13e72cc262899315e4ba55493 /sys/netccitt/llc_var.h | |
parent | 35a125282d2999b4fd6dea7bbf4696f937f5a052 (diff) |
From NetBSD: 960217 merge
Diffstat (limited to 'sys/netccitt/llc_var.h')
-rw-r--r-- | sys/netccitt/llc_var.h | 715 |
1 files changed, 371 insertions, 344 deletions
diff --git a/sys/netccitt/llc_var.h b/sys/netccitt/llc_var.h index 63f4f9a0856..1298cb0efe3 100644 --- a/sys/netccitt/llc_var.h +++ b/sys/netccitt/llc_var.h @@ -1,4 +1,5 @@ -/* $NetBSD: llc_var.h,v 1.4 1995/03/29 22:09:12 briggs Exp $ */ +/* $OpenBSD: llc_var.h,v 1.2 1996/03/04 07:36:36 niklas Exp $ */ +/* $NetBSD: llc_var.h,v 1.5 1996/02/13 22:05:01 christos Exp $ */ /* * Copyright (C) Dirk Husemann, Computer Science Department IV, @@ -41,14 +42,9 @@ * @(#)llc_var.h 8.1 (Berkeley) 6/10/93 */ -#ifdef __STDC__ -/* - * Forward structure declarations for function prototypes [sic]. - */ struct llc; -#endif -#define NPAIDB_LINK 0 +#define NPAIDB_LINK 0 struct npaidbentry { union { @@ -61,27 +57,27 @@ struct npaidbentry { struct { u_short SI_class; #define LLC_CLASS_I 0x1 -#define LLC_CLASS_II 0x3 +#define LLC_CLASS_II 0x3 #define LLC_CLASS_III 0x4 /* Future */ #define LLC_CLASS_IV 0x7 /* Future */ u_short SI_window; u_short SI_trace; u_short SI_xchxid; void (*SI_input) - __P((struct mbuf *)); - caddr_t (*SI_ctlinput) - __P((int, struct sockaddr *, caddr_t)); + __P((struct mbuf *,...)); + void *(*SI_ctlinput) + __P((int,struct sockaddr *,void *)); } SI; } NESIun; }; -#define np_link NESIun.NE.NE_link -#define np_rt NESIun.NE.NE_rt -#define si_class NESIun.SI.SI_class -#define si_window NESIun.SI.SI_window -#define si_trace NESIun.SI.SI_trace -#define si_xchxid NESIun.SI.SI_xchxid -#define si_input NESIun.SI.SI_input -#define si_ctlinput NESIun.SI.SI_ctlinput +#define np_link NESIun.NE.NE_link +#define np_rt NESIun.NE.NE_rt +#define si_class NESIun.SI.SI_class +#define si_window NESIun.SI.SI_window +#define si_trace NESIun.SI.SI_trace +#define si_xchxid NESIun.SI.SI_xchxid +#define si_input NESIun.SI.SI_input +#define si_ctlinput NESIun.SI.SI_ctlinput #define NPDL_SAPNETMASK 0x7e @@ -95,176 +91,182 @@ struct bitslice { }; -#define i_z 0 -#define i_ns 1 -#define i_pf 0 -#define i_nr 1 -#define s_oz 2 -#define s_selector 3 -#define s_pf 0 -#define s_nr 1 -#define u_bb 2 -#define u_select_other 3 -#define u_pf 4 -#define u_select 5 -#define f_vs 1 -#define f_cr 0 -#define f_vr 1 -#define f_wxyzv 6 - -#define LLCGBITS(Arg, Index) (((Arg) & llc_bitslice[(Index)].bs_mask) >> llc_bitslice[(Index)].bs_shift) -#define LLCSBITS(Arg, Index, Val) (Arg) |= (((Val) << llc_bitslice[(Index)].bs_shift) & llc_bitslice[(Index)].bs_mask) -#define LLCCSBITS(Arg, Index, Val) (Arg) = (((Val) << llc_bitslice[(Index)].bs_shift) & llc_bitslice[(Index)].bs_mask) +#define i_z 0 +#define i_ns 1 +#define i_pf 0 +#define i_nr 1 +#define s_oz 2 +#define s_selector 3 +#define s_pf 0 +#define s_nr 1 +#define u_bb 2 +#define u_select_other 3 +#define u_pf 4 +#define u_select 5 +#define f_vs 1 +#define f_cr 0 +#define f_vr 1 +#define f_wxyzv 6 + +#define LLCGBITS(Arg,Index) \ + (((Arg) & llc_bitslice[(Index)].bs_mask) >> \ + llc_bitslice[(Index)].bs_shift) +#define LLCSBITS(Arg,Index,Val) \ + (Arg) |= (((Val) << llc_bitslice[(Index)].bs_shift) & \ + llc_bitslice[(Index)].bs_mask) +#define LLCCSBITS(Arg,Index,Val) \ + (Arg) = (((Val) << llc_bitslice[(Index)].bs_shift) & \ + llc_bitslice[(Index)].bs_mask) extern struct bitslice llc_bitslice[]; -#define LLC_CMD 0 -#define LLC_RSP 1 -#define LLC_MAXCMDRSP 2 +#define LLC_CMD 0 +#define LLC_RSP 1 +#define LLC_MAXCMDRSP 2 /* * LLC events --- These events may either be frames received from the - * remote LLC DSAP, request from the network layer user, - * timer events from llc_timer(), or diagnostic events from - * llc_input(). + * remote LLC DSAP,request from the network layer user, + * timer events from llc_timer(),or diagnostic events from + * llc_input(). */ /* LLC frame types */ -#define LLCFT_INFO 0 * LLC_MAXCMDRSP -#define LLCFT_RR 1 * LLC_MAXCMDRSP -#define LLCFT_RNR 2 * LLC_MAXCMDRSP -#define LLCFT_REJ 3 * LLC_MAXCMDRSP -#define LLCFT_DM 4 * LLC_MAXCMDRSP -#define LLCFT_SABME 5 * LLC_MAXCMDRSP -#define LLCFT_DISC 6 * LLC_MAXCMDRSP -#define LLCFT_UA 7 * LLC_MAXCMDRSP -#define LLCFT_FRMR 8 * LLC_MAXCMDRSP -#define LLCFT_UI 9 * LLC_MAXCMDRSP -#define LLCFT_XID 10 * LLC_MAXCMDRSP -#define LLCFT_TEST 11 * LLC_MAXCMDRSP +#define LLCFT_INFO 0 * LLC_MAXCMDRSP +#define LLCFT_RR 1 * LLC_MAXCMDRSP +#define LLCFT_RNR 2 * LLC_MAXCMDRSP +#define LLCFT_REJ 3 * LLC_MAXCMDRSP +#define LLCFT_DM 4 * LLC_MAXCMDRSP +#define LLCFT_SABME 5 * LLC_MAXCMDRSP +#define LLCFT_DISC 6 * LLC_MAXCMDRSP +#define LLCFT_UA 7 * LLC_MAXCMDRSP +#define LLCFT_FRMR 8 * LLC_MAXCMDRSP +#define LLCFT_UI 9 * LLC_MAXCMDRSP +#define LLCFT_XID 10 * LLC_MAXCMDRSP +#define LLCFT_TEST 11 * LLC_MAXCMDRSP /* LLC2 timer events */ -#define LLC_ACK_TIMER_EXPIRED 12 * LLC_MAXCMDRSP -#define LLC_P_TIMER_EXPIRED 13 * LLC_MAXCMDRSP -#define LLC_REJ_TIMER_EXPIRED 14 * LLC_MAXCMDRSP -#define LLC_BUSY_TIMER_EXPIRED 15 * LLC_MAXCMDRSP +#define LLC_ACK_TIMER_EXPIRED 12 * LLC_MAXCMDRSP +#define LLC_P_TIMER_EXPIRED 13 * LLC_MAXCMDRSP +#define LLC_REJ_TIMER_EXPIRED 14 * LLC_MAXCMDRSP +#define LLC_BUSY_TIMER_EXPIRED 15 * LLC_MAXCMDRSP /* LLC2 diagnostic events */ -#define LLC_INVALID_NR 16 * LLC_MAXCMDRSP -#define LLC_INVALID_NS 17 * LLC_MAXCMDRSP -#define LLC_BAD_PDU 18 * LLC_MAXCMDRSP -#define LLC_LOCAL_BUSY_DETECTED 19 * LLC_MAXCMDRSP -#define LLC_LOCAL_BUSY_CLEARED 20 * LLC_MAXCMDRSP +#define LLC_INVALID_NR 16 * LLC_MAXCMDRSP +#define LLC_INVALID_NS 17 * LLC_MAXCMDRSP +#define LLC_BAD_PDU 18 * LLC_MAXCMDRSP +#define LLC_LOCAL_BUSY_DETECTED 19 * LLC_MAXCMDRSP +#define LLC_LOCAL_BUSY_CLEARED 20 * LLC_MAXCMDRSP /* Network layer user requests */ /* * NL_CONNECT_REQUEST --- The user has requested that a data link connection - * be established with a remote LLC DSAP. + * be established with a remote LLC DSAP. */ -#define NL_CONNECT_REQUEST 21 * LLC_MAXCMDRSP +#define NL_CONNECT_REQUEST 21 * LLC_MAXCMDRSP /* * NL_CONNECT_RESPONSE --- The user has accepted the data link connection. */ -#define NL_CONNECT_RESPONSE 22 * LLC_MAXCMDRSP +#define NL_CONNECT_RESPONSE 22 * LLC_MAXCMDRSP /* * NL_RESET_REQUEST --- The user has requested that the data link with the - * remote LLC DSAP be reset. + * remote LLC DSAP be reset. */ -#define NL_RESET_REQUEST 23 * LLC_MAXCMDRSP +#define NL_RESET_REQUEST 23 * LLC_MAXCMDRSP /* * NL_RESET_RESPONSE --- The user has accepted the reset of the data link - * connection. + * connection. */ -#define NL_RESET_RESPONSE 24 * LLC_MAXCMDRSP +#define NL_RESET_RESPONSE 24 * LLC_MAXCMDRSP /* * NL_DISCONNECT_REQUEST --- The user has requested that the data link - * connection with remote LLC DSAP be terminated. + * connection with remote LLC DSAP be terminated. */ -#define NL_DISCONNECT_REQUEST 25 * LLC_MAXCMDRSP +#define NL_DISCONNECT_REQUEST 25 * LLC_MAXCMDRSP /* * NL_DATA_REQUEST --- The user has requested that a data unit be sent ot the - * remote LLC DSAP. + * remote LLC DSAP. */ -#define NL_DATA_REQUEST 26 * LLC_MAXCMDRSP +#define NL_DATA_REQUEST 26 * LLC_MAXCMDRSP /* * NL_INITIATE_PF_CYCLE --- The local LLC wants to initiate a P/F cycle. */ -#define NL_INITIATE_PF_CYCLE 27 * LLC_MAXCMDRSP +#define NL_INITIATE_PF_CYCLE 27 * LLC_MAXCMDRSP /* * NL_LOCAL_BUSY_DETECTED --- The local entity has encountered a busy condition */ -#define NL_LOCAL_BUSY_DETECTED 28 * LLC_MAXCMDRSP +#define NL_LOCAL_BUSY_DETECTED 28 * LLC_MAXCMDRSP -#define LLCFT_NONE 255 +#define LLCFT_NONE 255 /* return message from state handlers */ /* * LLC_CONNECT_INDICATION --- Inform the user that a connection has been - * requested by a remote LLC SSAP. + * requested by a remote LLC SSAP. */ -#define LLC_CONNECT_INDICATION 1 +#define LLC_CONNECT_INDICATION 1 /* * LLC_CONNECT_CONFIRM --- The connection service component indicates that the - * remote network entity has accepted the connection. + * remote network entity has accepted the connection. */ -#define LLC_CONNECT_CONFIRM 2 +#define LLC_CONNECT_CONFIRM 2 /* * LLC_DISCONNECT_INDICATION --- Inform the user that the remote network - * entity has intiated disconnection of the data - * link connection. + * entity has intiated disconnection of the data + * link connection. */ #define LLC_DISCONNECT_INDICATION 3 /* * LLC_RESET_CONFIRM --- The connection service component indicates that the - * remote network entity has accepted the reset. + * remote network entity has accepted the reset. */ -#define LLC_RESET_CONFIRM 4 +#define LLC_RESET_CONFIRM 4 /* * LLC_RESET_INDICATION_REMOTE --- The remote network entity or remote peer - * has initiated a reset of the data link - * connection. + * has initiated a reset of the data link + * connection. */ #define LLC_RESET_INDICATION_REMOTE 5 /* * LLC_RESET_INDICATION_LOCAL --- The local LLC has determined that the data - * link connection is in need of - * reinitialization. + * link connection is in need of + * reinitialization. */ #define LLC_RESET_INDICATION_LOCAL 6 /* * LLC_FRMR_RECEIVED --- The local connection service component has received a - * FRMR response PDU. + * FRMR response PDU. */ -#define LLC_FRMR_RECEIVED 7 +#define LLC_FRMR_RECEIVED 7 /* * LLC_FRMR_SENT --- The local connection component has received an ivalid - * PDU, and has sent a FRMR response PDU. + * PDU,and has sent a FRMR response PDU. */ -#define LLC_FRMR_SENT 8 +#define LLC_FRMR_SENT 8 /* * LLC_DATA_INDICATION --- The connection service component passes the data - * unit from the received I PDU to the user. + * unit from the received I PDU to the user. */ -#define LLC_DATA_INDICATION 9 +#define LLC_DATA_INDICATION 9 /* * LLC_REMOTE_NOT_BUSY --- The remote LLC DSAP is no longer busy. The local - * connection service component will now accept a - * DATA_REQUEST. + * connection service component will now accept a + * DATA_REQUEST. */ -#define LLC_REMOTE_NOT_BUSY 10 +#define LLC_REMOTE_NOT_BUSY 10 /* * LLC_REMOTE_BUSY --- The remote LLC DSAP is busy. The local connection - * service component will not accept a DATA_REQUEST. + * service component will not accept a DATA_REQUEST. */ -#define LLC_REMOTE_BUSY 11 +#define LLC_REMOTE_BUSY 11 /* Internal return code */ -#define LLC_PASSITON 255 +#define LLC_PASSITON 255 #define INFORMATION_CONTROL 0x00 #define SUPERVISORY_CONTROL 0x02 -#define UNUMBERED_CONTROL 0x03 +#define UNUMBERED_CONTROL 0x03 /* * Other necessary definitions @@ -277,7 +279,7 @@ extern struct bitslice llc_bitslice[]; /* * Don't we love this one? CCITT likes to suck on bits 8=) */ -#define NLHDRSIZEGUESS 3 +#define NLHDRSIZEGUESS 3 /* * LLC control block @@ -288,59 +290,59 @@ struct llc_linkcb { struct llccb_q *q_forw; /* admin chain */ struct llccb_q *q_backw; } llcl_q; - struct npaidbentry *llcl_sapinfo; /* SAP information */ - struct sockaddr_dl llcl_addr; /* link snpa address */ - struct rtentry *llcl_nlrt; /* layer 3 -> LLC */ + struct npaidbentry *llcl_sapinfo; /* SAP information */ + struct sockaddr_dl llcl_addr; /* link snpa address */ + struct rtentry *llcl_nlrt; /* layer 3 -> LLC */ struct rtentry *llcl_llrt; /* LLC -> layer 3 */ - struct ifnet *llcl_if; /* our interface */ + struct ifnet *llcl_if; /* our interface */ caddr_t llcl_nlnext; /* cb for network layer */ - struct mbuf *llcl_writeqh; /* Write queue head */ - struct mbuf *llcl_writeqt; /* Write queue tail */ - struct mbuf **llcl_output_buffers; - short llcl_timers[6]; /* timer array */ - long llcl_timerflags; /* flags signalling running timers */ - int (*llcl_statehandler) - __P((struct llc_linkcb *, struct llc *, int, int, int)); - int llcl_P_flag; - int llcl_F_flag; - int llcl_S_flag; - int llcl_DATA_flag; - int llcl_REMOTE_BUSY_flag; - int llcl_DACTION_flag; /* delayed action */ - int llcl_retry; + struct mbuf *llcl_writeqh; /* Write queue head */ + struct mbuf *llcl_writeqt; /* Write queue tail */ + struct mbuf **llcl_output_buffers; + short llcl_timers[6]; /* timer array */ + long llcl_timerflags; /* flags signalling running timers */ + int (*llcl_statehandler) + __P((struct llc_linkcb *,struct llc *,int,int,int)); + int llcl_P_flag; + int llcl_F_flag; + int llcl_S_flag; + int llcl_DATA_flag; + int llcl_REMOTE_BUSY_flag; + int llcl_DACTION_flag; /* delayed action */ + int llcl_retry; /* * The following components deal --- in one way or the other --- * with the LLC2 window. Indicated by either [L] or [W] is the * domain of the specific component: * - * [L] The domain is 0--LLC_MAX_WINDOW - * [W] The domain is 0--llcl_window + * [L] The domain is 0--LLC_MAX_WINDOW + * [W] The domain is 0--llcl_window */ - short llcl_vr; /* next to receive [L] */ - short llcl_vs; /* next to send [L] */ - short llcl_nr_received; /* next frame to b ack'd [L] */ - short llcl_freeslot; /* next free slot [W] */ - short llcl_projvs; /* V(S) associated with freeslot */ - short llcl_slotsfree; /* free slots [W] */ - short llcl_window; /* window size */ + short llcl_vr; /* next to receive [L] */ + short llcl_vs; /* next to send [L] */ + short llcl_nr_received; /* next frame to b ack'd [L] */ + short llcl_freeslot; /* next free slot [W] */ + short llcl_projvs; /* V(S) associated with freeslot */ + short llcl_slotsfree; /* free slots [W] */ + short llcl_window; /* window size */ /* - * In llcl_frmrinfo we jot down the last frmr info field, which we + * In llcl_frmrinfo we jot down the last frmr info field,which we * need to do as we need to be able to resend it in the ERROR state. */ - struct frmrinfo llcl_frmrinfo; /* last FRMR info field */ + struct frmrinfo llcl_frmrinfo; /* last FRMR info field */ }; -#define llcl_frmr_pdu0 llcl_frmrinfo.rej_pdu_0 -#define llcl_frmr_pdu1 llcl_frmrinfo.rej_pdu_1 -#define llcl_frmr_control llcl_frmrinfo.frmr_control -#define llcl_frmr_control_ext llcl_frmrinfo.frmr_control_ext -#define llcl_frmr_cause llcl_frmrinfo.frmr_cause - -#define LQNEXT(l) (struct llc_linkcb *)((l)->llcl_q.q_forw) -#define LQEMPTY (llccb_q.q_forw == &llccb_q) -#define LQFIRST (struct llc_linkcb *)(llccb_q.q_forw) +#define llcl_frmr_pdu0 llcl_frmrinfo.rej_pdu_0 +#define llcl_frmr_pdu1 llcl_frmrinfo.rej_pdu_1 +#define llcl_frmr_control llcl_frmrinfo.frmr_control +#define llcl_frmr_control_ext llcl_frmrinfo.frmr_control_ext +#define llcl_frmr_cause llcl_frmrinfo.frmr_cause + +#define LQNEXT(l) (struct llc_linkcb *)((l)->llcl_q.q_forw) +#define LQEMPTY (llccb_q.q_forw == &llccb_q) +#define LQFIRST (struct llc_linkcb *)(llccb_q.q_forw) #define LQVALID(l) (!((struct llccb_q *)(l) == &llccb_q)) -#define LLC_ENQUEUE(l, m) if ((l)->llcl_writeqh == NULL) { \ +#define LLC_ENQUEUE(l,m) if ((l)->llcl_writeqh == NULL) { \ (l)->llcl_writeqh = (m); \ (l)->llcl_writeqt = (m); \ } else { \ @@ -348,29 +350,29 @@ struct llc_linkcb { (l)->llcl_writeqt = (m); \ } -#define LLC_DEQUEUE(l, m) if ((l)->llcl_writeqh == NULL) \ - (m) = NULL; \ - else { \ +#define LLC_DEQUEUE(l,m) if ((l)->llcl_writeqh == NULL) \ + (m) = NULL; \ + else { \ (m) = (l)->llcl_writeqh; \ (l)->llcl_writeqh = (l)->llcl_writeqh->m_nextpkt; \ } -#define LLC_SETFRAME(l, m) { \ - if ((l)->llcl_slotsfree > 0) { \ - (l)->llcl_slotsfree--; \ +#define LLC_SETFRAME(l,m) { \ + if ((l)->llcl_slotsfree > 0) { \ + (l)->llcl_slotsfree--; \ (l)->llcl_output_buffers[(l)->llcl_freeslot] = (m); \ (l)->llcl_freeslot = ((l)->llcl_freeslot+1) % (l)->llcl_window; \ LLC_INC((l)->llcl_projvs); \ } \ - } + } /* * handling of sockaddr_dl's */ -#define LLADDRLEN(s) ((s)->sdl_alen + (s)->sdl_nlen) -#define LLSAPADDR(s) ((s)->sdl_data[LLADDRLEN(s)-1] & 0xff) -#define LLSAPLOC(s, if) ((s)->sdl_nlen + (if)->if_addrlen) +#define LLADDRLEN(s) ((s)->sdl_alen + (s)->sdl_nlen) +#define LLSAPADDR(s) ((s)->sdl_data[LLADDRLEN(s)-1] & 0xff) +#define LLSAPLOC(s,if) ((s)->sdl_nlen + (if)->if_addrlen) struct sdl_hdr { struct sockaddr_dl sdlhdr_dst; @@ -379,156 +381,176 @@ struct sdl_hdr { }; #define LLC_GETHDR(f,m) { \ - struct mbuf *_m = (struct mbuf *) (m); \ - if (_m) { \ - M_PREPEND(_m, LLC_ISFRAMELEN, M_DONTWAIT); \ - bzero(mtod(_m, caddr_t), LLC_ISFRAMELEN); \ - } else { \ - MGETHDR (_m, M_DONTWAIT, MT_HEADER); \ - if (_m != NULL) { \ - _m->m_pkthdr.len = _m->m_len = LLC_UFRAMELEN; \ - _m->m_next = _m->m_act = NULL; \ - bzero(mtod(_m, caddr_t), LLC_UFRAMELEN); \ - } else return; \ - } \ - (m) = _m; \ - (f) = mtod(m, struct llc *); \ - } - -#define LLC_NEWSTATE(l, LLCstate) (l)->llcl_statehandler = llc_state_##LLCstate -#define LLC_STATEEQ(l, LLCstate) ((l)->llcl_statehandler == llc_state_##LLCstate ? 1 : 0) - -#define LLC_ACK_SHIFT 0 -#define LLC_P_SHIFT 1 -#define LLC_BUSY_SHIFT 2 -#define LLC_REJ_SHIFT 3 -#define LLC_AGE_SHIFT 4 + struct mbuf *_m = (struct mbuf *) (m); \ + if (_m) { \ + M_PREPEND(_m,LLC_ISFRAMELEN,M_DONTWAIT); \ + bzero(mtod(_m,caddr_t),LLC_ISFRAMELEN); \ + } else { \ + MGETHDR (_m,M_DONTWAIT,MT_HEADER); \ + if (_m != NULL) { \ + _m->m_pkthdr.len = _m->m_len = LLC_UFRAMELEN; \ + _m->m_next = _m->m_act = NULL; \ + bzero(mtod(_m,caddr_t),LLC_UFRAMELEN); \ + } else return; \ + } \ + (m) = _m; \ + (f) = mtod(m,struct llc *); \ +} + +#define LLC_NEWSTATE(l,LLCstate) \ + (l)->llcl_statehandler = __CONCAT(llc_state_,LLCstate) +#define LLC_STATEEQ(l,LLCstate) \ + ((l)->llcl_statehandler == __CONCAT(llc_state_,LLCstate) ? 1 : 0) + +#define LLC_ACK_SHIFT 0 +#define LLC_P_SHIFT 1 +#define LLC_BUSY_SHIFT 2 +#define LLC_REJ_SHIFT 3 +#define LLC_AGE_SHIFT 4 #define LLC_DACTION_SHIFT 5 -#define LLC_TIMER_NOTRUNNING 0 -#define LLC_TIMER_RUNNING 1 -#define LLC_TIMER_EXPIRED 2 - -#define LLC_STARTTIMER(l, LLCtimer) { \ - (l)->llcl_timers[LLC_##LLCtimer##_SHIFT] = llc_##LLCtimer##_timer; \ - (l)->llcl_timerflags |= (1<<LLC_##LLCtimer##_SHIFT); \ - } -#define LLC_STOPTIMER(l, LLCtimer) { \ - (l)->llcl_timers[LLC_##LLCtimer##_SHIFT] = 0; \ - (l)->llcl_timerflags &= ~(1<<LLC_##LLCtimer##_SHIFT); \ - } -#define LLC_AGETIMER(l, LLCtimer) if ((l)->llcl_timers[LLC_##LLCtimer##_SHIFT] > 0) \ - (l)->llcl_timers[LLC_##LLCtimer##_SHIFT]--; - -#define LLC_TIMERXPIRED(l, LLCtimer) \ - (((l)->llcl_timerflags & (1<<LLC_##LLCtimer##_SHIFT)) ? \ - (((l)->llcl_timers[LLC_##LLCtimer##_SHIFT] == 0 ) ? \ +#define LLC_TIMER_NOTRUNNING 0 +#define LLC_TIMER_RUNNING 1 +#define LLC_TIMER_EXPIRED 2 + +#ifndef __CONCAT3 +# if __STDC__ +# define __CONCAT3(a,b,c) a ## b ## c +# else +# define __CONCAT3(a,b,c) a/**/b/**/c +# endif /* __STDC__ */ +#endif + +#define LLC_STARTTIMER(l,LLCtimer) { \ + (l)->llcl_timers[__CONCAT3(LLC_,LLCtimer,_SHIFT)] = \ + __CONCAT3(llc_,LLCtimer,_timer); \ + (l)->llcl_timerflags |= (1 << __CONCAT3(LLC_,LLCtimer,_SHIFT)); \ +} +#define LLC_STOPTIMER(l,LLCtimer) { \ + (l)->llcl_timers[__CONCAT3(LLC_,LLCtimer,_SHIFT)] = 0; \ + (l)->llcl_timerflags &= ~(1<<__CONCAT3(LLC_,LLCtimer,_SHIFT)); \ +} +#define LLC_AGETIMER(l,LLCtimer) \ + if ((l)->llcl_timers[__CONCAT3(LLC_,LLCtimer,_SHIFT)] > 0) \ + (l)->llcl_timers[__CONCAT3(LLC_,LLCtimer,_SHIFT)]--; + +#define LLC_TIMERXPIRED(l,LLCtimer) \ + (((l)->llcl_timerflags & (1<<__CONCAT3(LLC_,LLCtimer,_SHIFT))) ? \ + (((l)->llcl_timers[__CONCAT3(LLC_,LLCtimer,_SHIFT)] == 0 ) ? \ LLC_TIMER_EXPIRED : LLC_TIMER_RUNNING) : LLC_TIMER_NOTRUNNING) -#define FOR_ALL_LLC_TIMERS(t) for ((t) = LLC_ACK_SHIFT; (t) < LLC_AGE_SHIFT; (t)++) +#define FOR_ALL_LLC_TIMERS(t) \ + for ((t) = LLC_ACK_SHIFT; (t) < LLC_AGE_SHIFT; (t)++) -#define LLC_SETFLAG(l, LLCflag, v) (l)->llcl_##LLCflag##_flag = (v) -#define LLC_GETFLAG(l, LLCflag) (l)->llcl_##LLCflag##_flag +#define LLC_SETFLAG(l,LLCflag,v) (l)->__CONCAT3(llcl_,LLCflag,_flag) = (v) +#define LLC_GETFLAG(l,LLCflag) (l)->__CONCAT3(llcl_,LLCflag,_flag) #define LLC_RESETCOUNTER(l) { \ - (l)->llcl_vs = (l)->llcl_vr = (l)->llcl_retry = 0; \ - llc_resetwindow((l)); \ - } + (l)->llcl_vs = (l)->llcl_vr = (l)->llcl_retry = 0; \ + llc_resetwindow((l)); \ +} /* * LLC2 macro definitions */ -#define LLC_START_ACK_TIMER(l) LLC_STARTTIMER((l), ACK) -#define LLC_STOP_ACK_TIMER(l) LLC_STOPTIMER((l), ACK) -#define LLC_START_REJ_TIMER(l) LLC_STARTTIMER((l), REJ) -#define LLC_STOP_REJ_TIMER(l) LLC_STOPTIMER((l), REJ) +#define LLC_START_ACK_TIMER(l) LLC_STARTTIMER((l),ACK) +#define LLC_STOP_ACK_TIMER(l) LLC_STOPTIMER((l),ACK) +#define LLC_START_REJ_TIMER(l) LLC_STARTTIMER((l),REJ) +#define LLC_STOP_REJ_TIMER(l) LLC_STOPTIMER((l),REJ) #define LLC_START_P_TIMER(l) { \ - LLC_STARTTIMER((l), P); \ - if (LLC_GETFLAG((l), P) == 0) \ - (l)->llcl_retry = 0; \ - LLC_SETFLAG((l), P, 1); \ - } + LLC_STARTTIMER((l),P); \ + if (LLC_GETFLAG((l),P) == 0) \ + (l)->llcl_retry = 0; \ + LLC_SETFLAG((l),P,1); \ +} #define LLC_STOP_P_TIMER(l) { \ - LLC_STOPTIMER((l), P); \ - LLC_SETFLAG((l), P, 0); \ - } + LLC_STOPTIMER((l),P); \ + LLC_SETFLAG((l),P,0); \ +} #define LLC_STOP_ALL_TIMERS(l) { \ - LLC_STOPTIMER((l), ACK); \ - LLC_STOPTIMER((l), REJ); \ - LLC_STOPTIMER((l), BUSY); \ - LLC_STOPTIMER((l), P); \ - } + LLC_STOPTIMER((l),ACK); \ + LLC_STOPTIMER((l),REJ); \ + LLC_STOPTIMER((l),BUSY); \ + LLC_STOPTIMER((l),P); \ +} #define LLC_INC(i) (i) = ((i)+1) % LLC_MAX_SEQUENCE -#define LLC_NR_VALID(l, nr) ((l)->llcl_vs < (l)->llcl_nr_received ? \ - (((nr) >= (l)->llcl_nr_received) || \ - ((nr) <= (l)->llcl_vs) ? 1 : 0) : \ - (((nr) <= (l)->llcl_vs) && \ - ((nr) >= (l)->llcl_nr_received) ? 1 : 0)) - -#define LLC_UPDATE_P_FLAG(l, cr, pf) { \ - if ((cr) == LLC_RSP && (pf) == 1) { \ - LLC_SETFLAG((l), P, 0); \ - LLC_STOPTIMER((l), P); \ - } \ - } - -#define LLC_UPDATE_NR_RECEIVED(l, nr) { \ - while ((l)->llcl_nr_received != (nr)) { \ - struct mbuf *_m; \ - register short seq; \ - if (_m = (l)->llcl_output_buffers[seq = llc_seq2slot((l), (l)->llcl_nr_received)]) \ - m_freem(_m); \ - (l)->llcl_output_buffers[seq] = NULL; \ - LLC_INC((l)->llcl_nr_received); \ - (l)->llcl_slotsfree++; \ - } \ - (l)->llcl_retry = 0; \ - if ((l)->llcl_slotsfree < (l)->llcl_window) { \ - LLC_START_ACK_TIMER(l); \ - } else LLC_STOP_ACK_TIMER(l); \ - LLC_STARTTIMER((l), DACTION); \ - } +#define LLC_NR_VALID(l,nr) \ + ((l)->llcl_vs < (l)->llcl_nr_received ? \ + (((nr) >= (l)->llcl_nr_received) || \ + ((nr) <= (l)->llcl_vs) ? 1 : 0) : \ + (((nr) <= (l)->llcl_vs) && \ + ((nr) >= (l)->llcl_nr_received) ? 1 : 0)) + +#define LLC_UPDATE_P_FLAG(l,cr,pf) { \ + if ((cr) == LLC_RSP && (pf) == 1) { \ + LLC_SETFLAG((l),P,0); \ + LLC_STOPTIMER((l),P); \ + } \ +} + +#define LLC_UPDATE_NR_RECEIVED(l,nr) { \ + while ((l)->llcl_nr_received != (nr)) { \ + struct mbuf *_m; \ + register short seq; \ + seq = llc_seq2slot((l),(l)->llcl_nr_received); \ + if ((_m = (l)->llcl_output_buffers[seq]) != NULL) \ + m_freem(_m); \ + (l)->llcl_output_buffers[seq] = NULL; \ + LLC_INC((l)->llcl_nr_received); \ + (l)->llcl_slotsfree++; \ + } \ + (l)->llcl_retry = 0; \ + if ((l)->llcl_slotsfree < (l)->llcl_window) { \ + LLC_START_ACK_TIMER(l); \ + } else { \ + LLC_STOP_ACK_TIMER(l); \ + } \ + LLC_STARTTIMER((l),DACTION); \ +} #define LLC_SET_REMOTE_BUSY(l,a) { \ - if (LLC_GETFLAG((l), REMOTE_BUSY) == 0) { \ - LLC_SETFLAG((l), REMOTE_BUSY, 1); \ - LLC_STARTTIMER((l), BUSY); \ - (a) = LLC_REMOTE_BUSY; \ - } else { \ - (a) = 0; \ - } \ - } + if (LLC_GETFLAG((l),REMOTE_BUSY) == 0) { \ + LLC_SETFLAG((l),REMOTE_BUSY,1); \ + LLC_STARTTIMER((l),BUSY); \ + (a) = LLC_REMOTE_BUSY; \ + } else { \ + (a) = 0; \ + } \ +} + #define LLC_CLEAR_REMOTE_BUSY(l,a) { \ - if (LLC_GETFLAG((l), REMOTE_BUSY) == 1) { \ - LLC_SETFLAG((l), REMOTE_BUSY, 1); \ - LLC_STOPTIMER((l), BUSY); \ - if (LLC_STATEEQ((l), NORMAL) || \ - LLC_STATEEQ((l), REJECT) || \ - LLC_STATEEQ((l), BUSY)) \ - llc_resend((l), LLC_CMD, 0); \ - (a) = LLC_REMOTE_NOT_BUSY; \ - } else { \ - (a) = 0; \ - } \ - } - -#define LLC_DACKCMD 0x1 -#define LLC_DACKCMDPOLL 0x2 -#define LLC_DACKRSP 0x3 + if (LLC_GETFLAG((l),REMOTE_BUSY) == 1) { \ + LLC_SETFLAG((l),REMOTE_BUSY,1); \ + LLC_STOPTIMER((l),BUSY); \ + if (LLC_STATEEQ((l),NORMAL) || \ + LLC_STATEEQ((l),REJECT) || \ + LLC_STATEEQ((l),BUSY)) \ + llc_resend((l),LLC_CMD,0); \ + (a) = LLC_REMOTE_NOT_BUSY; \ + } else { \ + (a) = 0; \ + } \ +} + +#define LLC_DACKCMD 0x1 +#define LLC_DACKCMDPOLL 0x2 +#define LLC_DACKRSP 0x3 #define LLC_DACKRSPFINAL 0x4 -#define LLC_SENDACKNOWLEDGE(l, cmd, pf) { \ - if ((cmd) == LLC_CMD) { \ - LLC_SETFLAG((l), DACTION, ((pf) == 0 ? LLC_DACKCMD : LLC_DACKCMDPOLL)); \ - } else { \ - LLC_SETFLAG((l), DACTION, ((pf) == 0 ? LLC_DACKRSP : LLC_DACKRSPFINAL)); \ - } \ - } +#define LLC_SENDACKNOWLEDGE(l,cmd,pf) { \ + if ((cmd) == LLC_CMD) { \ + LLC_SETFLAG((l),DACTION,((pf) == 0 ? LLC_DACKCMD : \ + LLC_DACKCMDPOLL)); \ + } else { \ + LLC_SETFLAG((l),DACTION,((pf) == 0 ? LLC_DACKRSP : \ + LLC_DACKRSPFINAL)); \ + } \ +} #define LLC_FRMR_W (1<<0) #define LLC_FRMR_X (1<<1) @@ -536,44 +558,44 @@ struct sdl_hdr { #define LLC_FRMR_Z (1<<3) #define LLC_FRMR_V (1<<4) -#define LLC_SETFRMR(l, f, cr, c) { \ - if ((f)->llc_control & 0x3) { \ - (l)->llcl_frmr_pdu0 = (f)->llc_control; \ - (l)->llcl_frmr_pdu1 = 0; \ - } else { \ - (l)->llcl_frmr_pdu0 = (f)->llc_control; \ - (l)->llcl_frmr_pdu1 = (f)->llc_control_ext; \ - } \ - LLCCSBITS((l)->llcl_frmr_control, f_vs, (l)->llcl_vs); \ - LLCCSBITS((l)->llcl_frmr_control_ext, f_cr, (cr)); \ - LLCSBITS((l)->llcl_frmr_control_ext, f_vr, (l)->llcl_vr); \ - LLCCSBITS((l)->llcl_frmr_cause, f_wxyzv, (c)); \ - } +#define LLC_SETFRMR(l,f,cr,c) { \ + if ((f)->llc_control & 0x3) { \ + (l)->llcl_frmr_pdu0 = (f)->llc_control; \ + (l)->llcl_frmr_pdu1 = 0; \ + } else { \ + (l)->llcl_frmr_pdu0 = (f)->llc_control; \ + (l)->llcl_frmr_pdu1 = (f)->llc_control_ext; \ + } \ + LLCCSBITS((l)->llcl_frmr_control,f_vs,(l)->llcl_vs); \ + LLCCSBITS((l)->llcl_frmr_control_ext,f_cr,(cr)); \ + LLCSBITS((l)->llcl_frmr_control_ext,f_vr,(l)->llcl_vr); \ + LLCCSBITS((l)->llcl_frmr_cause,f_wxyzv,(c)); \ +} /* * LLC tracing levels: - * LLCTR_INTERESTING interesting event, we might care to know about - * it, but then again, we might not ... - * LLCTR_SHOULDKNOW we probably should know about this event - * LLCTR_URGENT something has gone utterly wrong ... + * LLCTR_INTERESTING interesting event,we might care to know about + * it,but then again,we might not ... + * LLCTR_SHOULDKNOW we probably should know about this event + * LLCTR_URGENT something has gone utterly wrong ... */ -#define LLCTR_INTERESTING 1 -#define LLCTR_SHOULDKNOW 2 -#define LLCTR_URGENT 3 +#define LLCTR_INTERESTING 1 +#define LLCTR_SHOULDKNOW 2 +#define LLCTR_URGENT 3 #ifdef LLCDEBUG -#define LLC_TRACE(lp, l, msg) llc_trace((lp), (l), (msg)) +#define LLC_TRACE(lp,l,msg) llc_trace((lp),(l),(msg)) #else /* LLCDEBUG */ -#define LLC_TRACE(lp, l, msg) /* NOOP */ +#define LLC_TRACE(lp,l,msg) /* NOOP */ #endif /* LLCDEBUG */ -#define LLC_N2_VALUE 15 /* up to 15 retries */ -#define LLC_ACK_TIMER 10 /* 5 secs */ -#define LLC_P_TIMER 4 /* 2 secs */ -#define LLC_BUSY_TIMER 12 /* 6 secs */ -#define LLC_REJ_TIMER 12 /* 6 secs */ -#define LLC_AGE_TIMER 40 /* 20 secs */ -#define LLC_DACTION_TIMER 2 /* 1 secs */ +#define LLC_N2_VALUE 15 /* up to 15 retries */ +#define LLC_ACK_TIMER 10 /* 5 secs */ +#define LLC_P_TIMER 4 /* 2 secs */ +#define LLC_BUSY_TIMER 12 /* 6 secs */ +#define LLC_REJ_TIMER 12 /* 6 secs */ +#define LLC_AGE_TIMER 40 /* 20 secs */ +#define LLC_DACTION_TIMER 2 /* 1 secs */ #if defined (_KERNEL) && defined(LLC) extern int llc_n2; @@ -588,7 +610,7 @@ extern int af_link_rts_init_done; #define USES_AF_LINK_RTS { \ if (!af_link_rts_init_done) { \ - rn_inithead((void **)&rt_tables[AF_LINK], 32); \ + rn_inithead((void **)&rt_tables[AF_LINK],32); \ af_link_rts_init_done++; \ } \ } @@ -601,26 +623,39 @@ extern char *frame_names[]; /* * Function prototypes */ +/* llc_input.c */ +void llcintr __P((void)); +int llc_input __P((struct mbuf *, ...)); +void *llc_ctlinput __P((int, struct sockaddr *, void *)); + +/* llc_output.c */ +int llc_output __P((struct mbuf *, ...)); +void llc_start __P((struct llc_linkcb *)); +void llc_send __P((struct llc_linkcb *, int, int, int)); +void llc_resend __P((struct llc_linkcb *, int, int)); +void llc_rawsend __P((struct llc_linkcb *, struct mbuf *, struct llc *, int, + int, int, int)); + +/* llc_subr.c */ int sdl_cmp __P((struct sockaddr_dl *, struct sockaddr_dl *)); -int sdl_copy __P((struct sockaddr_dl *, struct sockaddr_dl *)); -int sdl_swapaddr __P((struct sockaddr_dl *, struct sockaddr_dl *)); +void sdl_copy __P((struct sockaddr_dl *, struct sockaddr_dl *)); +void sdl_swapaddr __P((struct sockaddr_dl *, struct sockaddr_dl *)); +struct sockaddr_dl *sdl_getaddrif __P((struct ifnet *)); int sdl_checkaddrif __P((struct ifnet *, struct sockaddr_dl *)); -int sdl_setaddrif __P((struct ifnet *, u_char *, u_char, u_char, - struct sockaddr_dl *)); -int sdl_sethdrif __P((struct ifnet *, u_char *, u_char, u_char *, u_char, u_char, - struct sdl_hdr *)); +int sdl_setaddrif __P((struct ifnet *, u_char *, u_char, u_char, + struct sockaddr_dl *)); +int sdl_sethdrif __P((struct ifnet *, u_char *, u_char, u_char *, u_char, + u_char, struct sdl_hdr *)); struct npaidbentry *llc_setsapinfo __P((struct ifnet *, u_char, u_char, struct dllconfig *)); struct npaidbentry *llc_getsapinfo __P((u_char, struct ifnet *)); -struct rtentry *npaidb_enrich __P((short, caddr_t, struct sockaddr_dl *)); -int npaidb_destroy __P((struct rtentry *)); short llc_seq2slot __P((struct llc_linkcb *, short)); int llc_state_ADM __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_CONN __P((struct llc_linkcb *, struct llc *, int, int, int)); -int llc_state_RESET_WAIT __P((struct llc_linkcb *, struct llc *, - int, int, int)); -int llc_state_RESET_CHECK __P((struct llc_linkcb *, struct llc *, - int, int, int)); +int llc_state_RESET_WAIT __P((struct llc_linkcb *, struct llc *, int, + int, int)); +int llc_state_RESET_CHECK __P((struct llc_linkcb *, struct llc *, int, + int, int)); int llc_state_SETUP __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_RESET __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_D_CONN __P((struct llc_linkcb *, struct llc *, int, int, int)); @@ -630,32 +665,24 @@ int llc_state_NORMAL __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_BUSY __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_REJECT __P((struct llc_linkcb *, struct llc *, int, int, int)); int llc_state_AWAIT __P((struct llc_linkcb *, struct llc *, int, int, int)); -int llc_state_AWAIT_BUSY __P((struct llc_linkcb *, struct llc *, int, int, int)); -int llc_state_AWAIT_REJECT __P((struct llc_linkcb *, struct llc *, int, int, int)); +int llc_state_AWAIT_BUSY __P((struct llc_linkcb *, struct llc *, int, int, + int)); +int llc_state_AWAIT_REJECT __P((struct llc_linkcb *, struct llc *, int, int, + int)); int llc_statehandler __P((struct llc_linkcb *, struct llc *, int, int, int)); -int llc_init __P((void)); -struct llc_linkcb *llc_newlink __P((struct sockaddr_dl *, struct ifnet *, - struct rtentry *, caddr_t, struct rtentry *)); -int llc_dellink __P((struct llc_linkcb *)); +void llc_init __P((void)); +void llc_resetwindow __P((struct llc_linkcb *)); +struct llc_linkcb *llc_newlink __P((struct sockaddr_dl *, struct ifnet *, + struct rtentry *, caddr_t, + struct rtentry *)); +void llc_dellink __P((struct llc_linkcb *)); +int llc_decode __P((struct llc *, struct llc_linkcb *)); int llc_anytimersup __P((struct llc_linkcb *)); -char * llc_getstatename __P((struct llc_linkcb *)); +char *llc_getstatename __P((struct llc_linkcb *)); void llc_link_dump __P((struct llc_linkcb *, const char *)); void llc_trace __P((struct llc_linkcb *, int, const char *)); -void llc_resetwindow __P((struct llc_linkcb *)); -int llc_decode __P((struct llc *, struct llc_linkcb *)); + +/* llc_timer.c */ void llc_timer __P((void)); -void llcintr __P((void)); -int llc_input __P((struct llc_linkcb *, struct mbuf *, u_char)); -caddr_t llc_ctlinput __P((int, struct sockaddr *, caddr_t)); -int llc_output __P((struct llc_linkcb *, struct mbuf *)); -void llc_start __P((struct llc_linkcb *)); -int llc_send __P((struct llc_linkcb *, int, int, int)); -int llc_resend __P((struct llc_linkcb *, int, int)); -int llc_rawsend __P((struct llc_linkcb *, struct mbuf *, struct llc *, int, int, - int, int)); -int cons_rtrequest __P((int, struct rtentry *, struct sockaddr *)); -long x25_llcglue __P((int, struct sockaddr *)); #endif - - |