Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    2) /******************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    4)  *	(C)Copyright 1998,1999 SysKonnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    5)  *	a business unit of Schneider & Koch & Co. Datensysteme GmbH.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    6)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    7)  *	See the file "skfddi.c" for further information.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300    9)  *	The information in this file is provided "AS IS" without warranty.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   11)  ******************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   13) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   14) 	Parameter Management Frame processing for SMT 7.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   17) #include "h/types.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   18) #include "h/fddi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   19) #include "h/smc.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   20) #include "h/smt_p.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   22) #define KERNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   23) #include "h/smtstate.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   25) #ifndef	SLIM_SMT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   27) #ifndef	lint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   28) static const char ID_sccs[] = "@(#)pmf.c	1.37 97/08/04 (C) SK " ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   29) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   31) static int smt_authorize(struct s_smc *smc, struct smt_header *sm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   32) static int smt_check_set_count(struct s_smc *smc, struct smt_header *sm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   33) static const struct s_p_tab* smt_get_ptab(u_short para);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   34) static int smt_mib_phys(struct s_smc *smc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   35) static int smt_set_para(struct s_smc *smc, struct smt_para *pa, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   36) 			int local, int set);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   37) void smt_add_para(struct s_smc *smc, struct s_pcon *pcon, u_short para,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   38) 		  int index, int local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   39) static SMbuf *smt_build_pmf_response(struct s_smc *smc, struct smt_header *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   40) 				     int set, int local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   41) static int port_to_mib(struct s_smc *smc, int p);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   43) #define MOFFSS(e)	offsetof(struct fddi_mib, e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   44) #define MOFFMS(e)	offsetof(struct fddi_mib_m, e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   45) #define MOFFAS(e)	offsetof(struct fddi_mib_a, e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   46) #define MOFFPS(e)	offsetof(struct fddi_mib_p, e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   49) #define AC_G	0x01		/* Get */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   50) #define AC_GR	0x02		/* Get/Set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   51) #define AC_S	0x04		/* Set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   52) #define AC_NA	0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   53) #define AC_GROUP	0x10		/* Group */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   54) #define MS2BCLK(x)	((x)*12500L)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   55) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   56) 	F	LFag (byte)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   57) 	B	byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   58) 	S	u_short	16 bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   59) 	C	Counter 32 bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   60) 	L	Long 32 bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   61) 	T	Timer_2	32 bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   62) 	P	TimeStamp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   63) 	A	LongAddress (6 byte)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   64) 	E	Enum 16 bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   65) 	R	ResId 16 Bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   66) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   67) static const struct s_p_tab {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   68) 	u_short	p_num ;		/* parameter code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   69) 	u_char	p_access ;	/* access rights */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   70) 	u_short	p_offset ;	/* offset in mib */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   71) 	char	p_swap[3] ;	/* format string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   72) } p_tab[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   73) 	/* StationIdGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   74) 	{ SMT_P100A,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   75) 	{ SMT_P100B,AC_G,	MOFFSS(fddiSMTStationId),	"8"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   76) 	{ SMT_P100D,AC_G,	MOFFSS(fddiSMTOpVersionId),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   77) 	{ SMT_P100E,AC_G,	MOFFSS(fddiSMTHiVersionId),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   78) 	{ SMT_P100F,AC_G,	MOFFSS(fddiSMTLoVersionId),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   79) 	{ SMT_P1010,AC_G,	MOFFSS(fddiSMTManufacturerData), "D" } ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   80) 	{ SMT_P1011,AC_GR,	MOFFSS(fddiSMTUserData),	"D"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   81) 	{ SMT_P1012,AC_G,	MOFFSS(fddiSMTMIBVersionId),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   83) 	/* StationConfigGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   84) 	{ SMT_P1014,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   85) 	{ SMT_P1015,AC_G,	MOFFSS(fddiSMTMac_Ct),		"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   86) 	{ SMT_P1016,AC_G,	MOFFSS(fddiSMTNonMaster_Ct),	"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   87) 	{ SMT_P1017,AC_G,	MOFFSS(fddiSMTMaster_Ct),	"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   88) 	{ SMT_P1018,AC_G,	MOFFSS(fddiSMTAvailablePaths),	"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   89) 	{ SMT_P1019,AC_G,	MOFFSS(fddiSMTConfigCapabilities),"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   90) 	{ SMT_P101A,AC_GR,	MOFFSS(fddiSMTConfigPolicy),	"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   91) 	{ SMT_P101B,AC_GR,	MOFFSS(fddiSMTConnectionPolicy),"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   92) 	{ SMT_P101D,AC_GR,	MOFFSS(fddiSMTTT_Notify),	"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   93) 	{ SMT_P101E,AC_GR,	MOFFSS(fddiSMTStatRptPolicy),	"bB"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   94) 	{ SMT_P101F,AC_GR,	MOFFSS(fddiSMTTrace_MaxExpiration),"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   95) 	{ SMT_P1020,AC_G,	MOFFSS(fddiSMTPORTIndexes),	"II"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   96) 	{ SMT_P1021,AC_G,	MOFFSS(fddiSMTMACIndexes),	"I"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   97) 	{ SMT_P1022,AC_G,	MOFFSS(fddiSMTBypassPresent),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   99) 	/* StatusGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  100) 	{ SMT_P1028,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  101) 	{ SMT_P1029,AC_G,	MOFFSS(fddiSMTECMState),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  102) 	{ SMT_P102A,AC_G,	MOFFSS(fddiSMTCF_State),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  103) 	{ SMT_P102C,AC_G,	MOFFSS(fddiSMTRemoteDisconnectFlag),"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  104) 	{ SMT_P102D,AC_G,	MOFFSS(fddiSMTStationStatus),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  105) 	{ SMT_P102E,AC_G,	MOFFSS(fddiSMTPeerWrapFlag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  106) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  107) 	/* MIBOperationGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  108) 	{ SMT_P1032,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  109) 	{ SMT_P1033,AC_G,	MOFFSS(fddiSMTTimeStamp),"P"		} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  110) 	{ SMT_P1034,AC_G,	MOFFSS(fddiSMTTransitionTimeStamp),"P"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  111) 	/* NOTE : SMT_P1035 is already swapped ! SMT_P_SETCOUNT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  112) 	{ SMT_P1035,AC_G,	MOFFSS(fddiSMTSetCount),"4P"		} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  113) 	{ SMT_P1036,AC_G,	MOFFSS(fddiSMTLastSetStationId),"8"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  114) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  115) 	{ SMT_P103C,AC_S,	0,				"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  117) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  118) 	 * PRIVATE EXTENSIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  119) 	 * only accessible locally to get/set passwd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  120) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  121) 	{ SMT_P10F0,AC_GR,	MOFFSS(fddiPRPMFPasswd),	"8"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  122) 	{ SMT_P10F1,AC_GR,	MOFFSS(fddiPRPMFStation),	"8"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  123) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  124) 	{ SMT_P10F2,AC_GR,	MOFFSS(fddiESSPayload),		"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  125) 	{ SMT_P10F3,AC_GR,	MOFFSS(fddiESSOverhead),	"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  126) 	{ SMT_P10F4,AC_GR,	MOFFSS(fddiESSMaxTNeg),		"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  127) 	{ SMT_P10F5,AC_GR,	MOFFSS(fddiESSMinSegmentSize),	"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  128) 	{ SMT_P10F6,AC_GR,	MOFFSS(fddiESSCategory),	"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  129) 	{ SMT_P10F7,AC_GR,	MOFFSS(fddiESSSynchTxMode),	"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  130) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  131) #ifdef	SBA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  132) 	{ SMT_P10F8,AC_GR,	MOFFSS(fddiSBACommand),		"bF"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  133) 	{ SMT_P10F9,AC_GR,	MOFFSS(fddiSBAAvailable),	"bF"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  134) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  135) 	/* MAC Attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  136) 	{ SMT_P200A,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  137) 	{ SMT_P200B,AC_G,	MOFFMS(fddiMACFrameStatusFunctions),"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  138) 	{ SMT_P200D,AC_G,	MOFFMS(fddiMACT_MaxCapabilitiy),"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  139) 	{ SMT_P200E,AC_G,	MOFFMS(fddiMACTVXCapabilitiy),"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  140) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  141) 	/* ConfigGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  142) 	{ SMT_P2014,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  143) 	{ SMT_P2016,AC_G,	MOFFMS(fddiMACAvailablePaths),	"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  144) 	{ SMT_P2017,AC_G,	MOFFMS(fddiMACCurrentPath),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  145) 	{ SMT_P2018,AC_G,	MOFFMS(fddiMACUpstreamNbr),	"A"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  146) 	{ SMT_P2019,AC_G,	MOFFMS(fddiMACDownstreamNbr),	"A"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  147) 	{ SMT_P201A,AC_G,	MOFFMS(fddiMACOldUpstreamNbr),	"A"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  148) 	{ SMT_P201B,AC_G,	MOFFMS(fddiMACOldDownstreamNbr),"A"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  149) 	{ SMT_P201D,AC_G,	MOFFMS(fddiMACDupAddressTest),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  150) 	{ SMT_P2020,AC_GR,	MOFFMS(fddiMACRequestedPaths),	"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  151) 	{ SMT_P2021,AC_G,	MOFFMS(fddiMACDownstreamPORTType),"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  152) 	{ SMT_P2022,AC_G,	MOFFMS(fddiMACIndex),		"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  154) 	/* AddressGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  155) 	{ SMT_P2028,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  156) 	{ SMT_P2029,AC_G,	MOFFMS(fddiMACSMTAddress),	"A"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  158) 	/* OperationGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  159) 	{ SMT_P2032,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  160) 	{ SMT_P2033,AC_G,	MOFFMS(fddiMACT_Req),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  161) 	{ SMT_P2034,AC_G,	MOFFMS(fddiMACT_Neg),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  162) 	{ SMT_P2035,AC_G,	MOFFMS(fddiMACT_Max),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  163) 	{ SMT_P2036,AC_G,	MOFFMS(fddiMACTvxValue),	"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  164) 	{ SMT_P2038,AC_G,	MOFFMS(fddiMACT_Pri0),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  165) 	{ SMT_P2039,AC_G,	MOFFMS(fddiMACT_Pri1),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  166) 	{ SMT_P203A,AC_G,	MOFFMS(fddiMACT_Pri2),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  167) 	{ SMT_P203B,AC_G,	MOFFMS(fddiMACT_Pri3),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  168) 	{ SMT_P203C,AC_G,	MOFFMS(fddiMACT_Pri4),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  169) 	{ SMT_P203D,AC_G,	MOFFMS(fddiMACT_Pri5),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  170) 	{ SMT_P203E,AC_G,	MOFFMS(fddiMACT_Pri6),		"T"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  171) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  172) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  173) 	/* CountersGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  174) 	{ SMT_P2046,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  175) 	{ SMT_P2047,AC_G,	MOFFMS(fddiMACFrame_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  176) 	{ SMT_P2048,AC_G,	MOFFMS(fddiMACCopied_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  177) 	{ SMT_P2049,AC_G,	MOFFMS(fddiMACTransmit_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  178) 	{ SMT_P204A,AC_G,	MOFFMS(fddiMACToken_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  179) 	{ SMT_P2051,AC_G,	MOFFMS(fddiMACError_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  180) 	{ SMT_P2052,AC_G,	MOFFMS(fddiMACLost_Ct),		"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  181) 	{ SMT_P2053,AC_G,	MOFFMS(fddiMACTvxExpired_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  182) 	{ SMT_P2054,AC_G,	MOFFMS(fddiMACNotCopied_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  183) 	{ SMT_P2056,AC_G,	MOFFMS(fddiMACRingOp_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  185) 	/* FrameErrorConditionGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  186) 	{ SMT_P205A,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  187) 	{ SMT_P205F,AC_GR,	MOFFMS(fddiMACFrameErrorThreshold),"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  188) 	{ SMT_P2060,AC_G,	MOFFMS(fddiMACFrameErrorRatio),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  189) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  190) 	/* NotCopiedConditionGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  191) 	{ SMT_P2064,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  192) 	{ SMT_P2067,AC_GR,	MOFFMS(fddiMACNotCopiedThreshold),"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  193) 	{ SMT_P2069,AC_G,	MOFFMS(fddiMACNotCopiedRatio),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  195) 	/* StatusGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  196) 	{ SMT_P206E,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  197) 	{ SMT_P206F,AC_G,	MOFFMS(fddiMACRMTState),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  198) 	{ SMT_P2070,AC_G,	MOFFMS(fddiMACDA_Flag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  199) 	{ SMT_P2071,AC_G,	MOFFMS(fddiMACUNDA_Flag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  200) 	{ SMT_P2072,AC_G,	MOFFMS(fddiMACFrameErrorFlag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  201) 	{ SMT_P2073,AC_G,	MOFFMS(fddiMACNotCopiedFlag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  202) 	{ SMT_P2074,AC_G,	MOFFMS(fddiMACMA_UnitdataAvailable),"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  203) 	{ SMT_P2075,AC_G,	MOFFMS(fddiMACHardwarePresent),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  204) 	{ SMT_P2076,AC_GR,	MOFFMS(fddiMACMA_UnitdataEnable),"bF"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  205) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  206) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  207) 	 * PRIVATE EXTENSIONS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  208) 	 * only accessible locally to get/set TMIN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  209) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  210) 	{ SMT_P20F0,AC_NA						} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  211) 	{ SMT_P20F1,AC_GR,	MOFFMS(fddiMACT_Min),		"lT"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  212) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  213) 	/* Path Attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  214) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  215) 	 * DON't swap 320B,320F,3210: they are already swapped in swap_para()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  216) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  217) 	{ SMT_P320A,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  218) 	{ SMT_P320B,AC_G,	MOFFAS(fddiPATHIndex),		"r"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  219) 	{ SMT_P320F,AC_GR,	MOFFAS(fddiPATHSbaPayload),	"l4"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  220) 	{ SMT_P3210,AC_GR,	MOFFAS(fddiPATHSbaOverhead),	"l4"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  221) 	/* fddiPATHConfiguration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  222) 	{ SMT_P3212,AC_G,	0,				""	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  223) 	{ SMT_P3213,AC_GR,	MOFFAS(fddiPATHT_Rmode),	"lT"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  224) 	{ SMT_P3214,AC_GR,	MOFFAS(fddiPATHSbaAvailable),	"lL"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  225) 	{ SMT_P3215,AC_GR,	MOFFAS(fddiPATHTVXLowerBound),	"lT"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  226) 	{ SMT_P3216,AC_GR,	MOFFAS(fddiPATHT_MaxLowerBound),"lT"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  227) 	{ SMT_P3217,AC_GR,	MOFFAS(fddiPATHMaxT_Req),	"lT"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  228) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  229) 	/* Port Attributes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  230) 	/* ConfigGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  231) 	{ SMT_P400A,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  232) 	{ SMT_P400C,AC_G,	MOFFPS(fddiPORTMy_Type),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  233) 	{ SMT_P400D,AC_G,	MOFFPS(fddiPORTNeighborType),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  234) 	{ SMT_P400E,AC_GR,	MOFFPS(fddiPORTConnectionPolicies),"bB"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  235) 	{ SMT_P400F,AC_G,	MOFFPS(fddiPORTMacIndicated),	"2"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  236) 	{ SMT_P4010,AC_G,	MOFFPS(fddiPORTCurrentPath),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  237) 	{ SMT_P4011,AC_GR,	MOFFPS(fddiPORTRequestedPaths),	"l4"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  238) 	{ SMT_P4012,AC_G,	MOFFPS(fddiPORTMACPlacement),	"S"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  239) 	{ SMT_P4013,AC_G,	MOFFPS(fddiPORTAvailablePaths),	"B"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  240) 	{ SMT_P4016,AC_G,	MOFFPS(fddiPORTPMDClass),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  241) 	{ SMT_P4017,AC_G,	MOFFPS(fddiPORTConnectionCapabilities),	"B"} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  242) 	{ SMT_P401D,AC_G,	MOFFPS(fddiPORTIndex),		"R"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  244) 	/* OperationGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  245) 	{ SMT_P401E,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  246) 	{ SMT_P401F,AC_GR,	MOFFPS(fddiPORTMaint_LS),	"wE"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  247) 	{ SMT_P4021,AC_G,	MOFFPS(fddiPORTBS_Flag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  248) 	{ SMT_P4022,AC_G,	MOFFPS(fddiPORTPC_LS),		"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  249) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  250) 	/* ErrorCtrsGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  251) 	{ SMT_P4028,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  252) 	{ SMT_P4029,AC_G,	MOFFPS(fddiPORTEBError_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  253) 	{ SMT_P402A,AC_G,	MOFFPS(fddiPORTLCTFail_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  254) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  255) 	/* LerGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  256) 	{ SMT_P4032,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  257) 	{ SMT_P4033,AC_G,	MOFFPS(fddiPORTLer_Estimate),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  258) 	{ SMT_P4034,AC_G,	MOFFPS(fddiPORTLem_Reject_Ct),	"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  259) 	{ SMT_P4035,AC_G,	MOFFPS(fddiPORTLem_Ct),		"C"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  260) 	{ SMT_P403A,AC_GR,	MOFFPS(fddiPORTLer_Cutoff),	"bB"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  261) 	{ SMT_P403B,AC_GR,	MOFFPS(fddiPORTLer_Alarm),	"bB"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  263) 	/* StatusGrp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  264) 	{ SMT_P403C,AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  265) 	{ SMT_P403D,AC_G,	MOFFPS(fddiPORTConnectState),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  266) 	{ SMT_P403E,AC_G,	MOFFPS(fddiPORTPCMStateX),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  267) 	{ SMT_P403F,AC_G,	MOFFPS(fddiPORTPC_Withhold),	"E"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  268) 	{ SMT_P4040,AC_G,	MOFFPS(fddiPORTLerFlag),	"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  269) 	{ SMT_P4041,AC_G,	MOFFPS(fddiPORTHardwarePresent),"F"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  270) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  271) 	{ SMT_P4046,AC_S,	0,				"wS"	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  273) 	{ 0,	AC_GROUP	} ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  274) 	{ 0 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  275) } ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  276) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  277) void smt_pmf_received_pack(struct s_smc *smc, SMbuf *mb, int local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  279) 	struct smt_header	*sm ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  280) 	SMbuf		*reply ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  282) 	sm = smtod(mb,struct smt_header *) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  283) 	DB_SMT("SMT: processing PMF frame at %p len %d", sm, mb->sm_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  284) #ifdef	DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  285) 	dump_smt(smc,sm,"PMF Received") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  286) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  287) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  288) 	 * Start the watchdog: It may be a long, long packet and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  289) 	 * maybe the watchdog occurs ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  290) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  291) 	smt_start_watchdog(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  292) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  293) 	if (sm->smt_class == SMT_PMF_GET ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  294) 	    sm->smt_class == SMT_PMF_SET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  295) 		reply = smt_build_pmf_response(smc,sm,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  296) 			sm->smt_class == SMT_PMF_SET,local) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  297) 		if (reply) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  298) 			sm = smtod(reply,struct smt_header *) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  299) #ifdef	DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  300) 			dump_smt(smc,sm,"PMF Reply") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  302) 			smt_send_frame(smc,reply,FC_SMT_INFO,local) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  303) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  304) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  305) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  307) static SMbuf *smt_build_pmf_response(struct s_smc *smc, struct smt_header *req,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  308) 				     int set, int local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  309) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  310) 	SMbuf			*mb ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  311) 	struct smt_header	*smt ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  312) 	struct smt_para		*pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  313) 	struct smt_p_reason	*res ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  314) 	const struct s_p_tab	*pt ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  315) 	int			len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  316) 	int			index ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  317) 	int			idx_end ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  318) 	int			error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  319) 	int			range ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  320) 	SK_LOC_DECL(struct s_pcon,pcon) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  321) 	SK_LOC_DECL(struct s_pcon,set_pcon) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  322) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  323) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  324) 	 * build SMT header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  325) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  326) 	if (!(mb = smt_get_mbuf(smc)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  327) 		return mb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  328) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  329) 	smt = smtod(mb, struct smt_header *) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  330) 	smt->smt_dest = req->smt_source ;	/* DA == source of request */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  331) 	smt->smt_class = req->smt_class ;	/* same class (GET/SET) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  332) 	smt->smt_type = SMT_REPLY ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  333) 	smt->smt_version = SMT_VID_2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  334) 	smt->smt_tid = req->smt_tid ;		/* same TID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  335) 	smt->smt_pad = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  336) 	smt->smt_len = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  337) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  338) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  339) 	 * setup parameter status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  340) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  341) 	pcon.pc_len = SMT_MAX_INFO_LEN ;	/* max para length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  342) 	pcon.pc_err = 0 ;			/* no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  343) 	pcon.pc_badset = 0 ;			/* no bad set count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  344) 	pcon.pc_p = (void *) (smt + 1) ;	/* paras start here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  346) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  347) 	 * check authoriziation and set count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  348) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  349) 	error = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  350) 	if (set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  351) 		if (!local && smt_authorize(smc,req))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  352) 			error = SMT_RDF_AUTHOR ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  353) 		else if (smt_check_set_count(smc,req))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  354) 			pcon.pc_badset = SMT_RDF_BADSET ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  355) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  356) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  357) 	 * add reason code and all mandatory parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  358) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  359) 	res = (struct smt_p_reason *) pcon.pc_p ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  360) 	smt_add_para(smc,&pcon,(u_short) SMT_P_REASON,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  361) 	smt_add_para(smc,&pcon,(u_short) SMT_P1033,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  362) 	/* update 1035 and 1036 later if set */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  363) 	set_pcon = pcon ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  364) 	smt_add_para(smc,&pcon,(u_short) SMT_P1035,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  365) 	smt_add_para(smc,&pcon,(u_short) SMT_P1036,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  367) 	pcon.pc_err = error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  368) 	len = req->smt_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  369) 	pa = (struct smt_para *) (req + 1) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  370) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  371) 	 * process list of paras
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  372) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  373) 	while (!pcon.pc_err && len > 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  374) 		if (((u_short)len < pa->p_len + PARA_LEN) || (pa->p_len & 3)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  375) 			pcon.pc_err = SMT_RDF_LENGTH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  376) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  377) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  378) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  379) 		if (((range = (pa->p_type & 0xf000)) == 0x2000) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  380) 			range == 0x3000 || range == 0x4000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  381) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  382) 			 * get index for PART,MAC ad PATH group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  383) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  384) 			index = *((u_char *)pa + PARA_LEN + 3) ;/* index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  385) 			idx_end = index ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  386) 			if (!set && (pa->p_len != 4)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  387) 				pcon.pc_err = SMT_RDF_LENGTH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  388) 				break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  389) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  390) 			if (!index && !set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  391) 				switch (range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  392) 				case 0x2000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  393) 					index = INDEX_MAC ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  394) 					idx_end = index - 1 + NUMMACS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  395) 					break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  396) 				case 0x3000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  397) 					index = INDEX_PATH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  398) 					idx_end = index - 1 + NUMPATHS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  399) 					break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  400) 				case 0x4000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  401) 					index = INDEX_PORT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  402) 					idx_end = index - 1 + NUMPHYS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  403) #ifndef	CONCENTRATOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  404) 					if (smc->s.sas == SMT_SAS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  405) 						idx_end = INDEX_PORT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  406) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  407) 					break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  408) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  409) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  410) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  411) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  412) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  413) 			 * smt group has no index
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  414) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  415) 			if (!set && (pa->p_len != 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  416) 				pcon.pc_err = SMT_RDF_LENGTH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  417) 				break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  418) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  419) 			index = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  420) 			idx_end = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  421) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  422) 		while (index <= idx_end) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  423) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  424) 			 * if group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  425) 			 *	add all paras of group
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  426) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  427) 			pt = smt_get_ptab(pa->p_type) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  428) 			if (pt && pt->p_access == AC_GROUP && !set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  429) 				pt++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  430) 				while (pt->p_access == AC_G ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  431) 					pt->p_access == AC_GR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  432) 					smt_add_para(smc,&pcon,pt->p_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  433) 						index,local);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  434) 					pt++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  435) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  436) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  437) 			/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  438) 			 * ignore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  439) 			 *	AUTHORIZATION in get/set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  440) 			 *	SET COUNT in set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  441) 			 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  442) 			else if (pa->p_type != SMT_P_AUTHOR &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  443) 				 (!set || (pa->p_type != SMT_P1035))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  444) 				int	st ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  445) 				if (pcon.pc_badset) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  446) 					smt_add_para(smc,&pcon,pa->p_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  447) 						index,local) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  448) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  449) 				else if (set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  450) 					st = smt_set_para(smc,pa,index,local,1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  451) 					/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  452) 					 * return para even if error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  453) 					 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  454) 					smt_add_para(smc,&pcon,pa->p_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  455) 						index,local) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  456) 					pcon.pc_err = st ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  457) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  458) 				else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  459) 					if (pt && pt->p_access == AC_S) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  460) 						pcon.pc_err =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  461) 							SMT_RDF_ILLEGAL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  462) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  463) 					smt_add_para(smc,&pcon,pa->p_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  464) 						index,local) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  465) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  466) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  467) 			if (pcon.pc_err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  468) 				break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  469) 			index++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  470) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  471) 		len -= pa->p_len + PARA_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  472) 		pa = (struct smt_para *) ((char *)pa + pa->p_len + PARA_LEN) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  473) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  474) 	smt->smt_len = SMT_MAX_INFO_LEN - pcon.pc_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  475) 	mb->sm_len = smt->smt_len + sizeof(struct smt_header) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  476) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  477) 	/* update reason code */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  478) 	res->rdf_reason = pcon.pc_badset ? pcon.pc_badset :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  479) 			pcon.pc_err ? pcon.pc_err : SMT_RDF_SUCCESS ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  480) 	if (set && (res->rdf_reason == SMT_RDF_SUCCESS)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  481) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  482) 		 * increment set count
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  483) 		 * set time stamp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  484) 		 * store station id of last set
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  485) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  486) 		smc->mib.fddiSMTSetCount.count++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  487) 		smt_set_timestamp(smc,smc->mib.fddiSMTSetCount.timestamp) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  488) 		smc->mib.fddiSMTLastSetStationId = req->smt_sid ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  489) 		smt_add_para(smc,&set_pcon,(u_short) SMT_P1035,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  490) 		smt_add_para(smc,&set_pcon,(u_short) SMT_P1036,0,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  491) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  492) 	return mb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  494) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  495) static int smt_authorize(struct s_smc *smc, struct smt_header *sm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  496) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  497) 	struct smt_para	*pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  498) 	int		i ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  499) 	char		*p ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  500) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  501) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  502) 	 * check source station id if not zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  503) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  504) 	p = (char *) &smc->mib.fddiPRPMFStation ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  505) 	for (i = 0 ; i < 8 && !p[i] ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  506) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  507) 	if (i != 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  508) 		if (memcmp((char *) &sm->smt_sid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  509) 			(char *) &smc->mib.fddiPRPMFStation,8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  510) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  511) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  512) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  513) 	 * check authoriziation parameter if passwd not zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  514) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  515) 	p = (char *) smc->mib.fddiPRPMFPasswd ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  516) 	for (i = 0 ; i < 8 && !p[i] ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  517) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  518) 	if (i != 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  519) 		pa = (struct smt_para *) sm_to_para(smc,sm,SMT_P_AUTHOR) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  520) 		if (!pa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  521) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  522) 		if (pa->p_len != 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  523) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  524) 		if (memcmp((char *)(pa+1),(char *)smc->mib.fddiPRPMFPasswd,8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  525) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  526) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  527) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  529) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  530) static int smt_check_set_count(struct s_smc *smc, struct smt_header *sm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  531) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  532) 	struct smt_para	*pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  533) 	struct smt_p_setcount	*sc ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  534) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  535) 	pa = (struct smt_para *) sm_to_para(smc,sm,SMT_P1035) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  536) 	if (pa) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  537) 		sc = (struct smt_p_setcount *) pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  538) 		if ((smc->mib.fddiSMTSetCount.count != sc->count) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  539) 			memcmp((char *) smc->mib.fddiSMTSetCount.timestamp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  540) 			(char *)sc->timestamp,8))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  541) 			return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  542) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  543) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  546) void smt_add_para(struct s_smc *smc, struct s_pcon *pcon, u_short para,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  547) 		  int index, int local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  548) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  549) 	struct smt_para	*pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  550) 	const struct s_p_tab	*pt ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  551) 	struct fddi_mib_m *mib_m = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  552) 	struct fddi_mib_p *mib_p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  553) 	int		len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  554) 	int		plen ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  555) 	char		*from ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  556) 	char		*to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  557) 	const char	*swap ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  558) 	char		c ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  559) 	int		range ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  560) 	char		*mib_addr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  561) 	int		mac ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  562) 	int		path ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  563) 	int		port ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  564) 	int		sp_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  565) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  566) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  567) 	 * skip if error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  568) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  569) 	if (pcon->pc_err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  570) 		return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  571) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  572) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  573) 	 * actions don't have a value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  574) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  575) 	pt = smt_get_ptab(para) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  576) 	if (pt && pt->p_access == AC_S)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  577) 		return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  578) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  579) 	to = (char *) (pcon->pc_p) ;	/* destination pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  580) 	len = pcon->pc_len ;		/* free space */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  581) 	plen = len ;			/* remember start length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  582) 	pa = (struct smt_para *) to ;	/* type/length pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  583) 	to += PARA_LEN ;		/* skip smt_para */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  584) 	len -= PARA_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  585) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  586) 	 * set index if required
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  587) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  588) 	if (((range = (para & 0xf000)) == 0x2000) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  589) 		range == 0x3000 || range == 0x4000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  590) 		if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  591) 			goto wrong_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  592) 		to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  593) 		to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  594) 		to[2] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  595) 		to[3] = index ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  596) 		len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  597) 		to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  598) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  599) 	mac = index - INDEX_MAC ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  600) 	path = index - INDEX_PATH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  601) 	port = index - INDEX_PORT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  602) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  603) 	 * get pointer to mib
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  604) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  605) 	switch (range) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  606) 	case 0x1000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  607) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  608) 		mib_addr = (char *) (&smc->mib) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  609) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  610) 	case 0x2000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  611) 		if (mac < 0 || mac >= NUMMACS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  612) 			pcon->pc_err = SMT_RDF_NOPARAM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  613) 			return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  614) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  615) 		mib_addr = (char *) (&smc->mib.m[mac]) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  616) 		mib_m = (struct fddi_mib_m *) mib_addr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  617) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  618) 	case 0x3000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  619) 		if (path < 0 || path >= NUMPATHS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  620) 			pcon->pc_err = SMT_RDF_NOPARAM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  621) 			return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  622) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  623) 		mib_addr = (char *) (&smc->mib.a[path]) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  624) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  625) 	case 0x4000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  626) 		if (port < 0 || port >= smt_mib_phys(smc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  627) 			pcon->pc_err = SMT_RDF_NOPARAM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  628) 			return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  629) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  630) 		mib_addr = (char *) (&smc->mib.p[port_to_mib(smc,port)]) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  631) 		mib_p = (struct fddi_mib_p *) mib_addr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  632) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  633) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  634) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  635) 	 * check special paras
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  636) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  637) 	swap = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  638) 	switch (para) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  639) 	case SMT_P10F0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  640) 	case SMT_P10F1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  641) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  642) 	case SMT_P10F2 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  643) 	case SMT_P10F3 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  644) 	case SMT_P10F4 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  645) 	case SMT_P10F5 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  646) 	case SMT_P10F6 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  647) 	case SMT_P10F7 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  648) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  649) #ifdef	SBA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  650) 	case SMT_P10F8 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  651) 	case SMT_P10F9 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  652) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  653) 	case SMT_P20F1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  654) 		if (!local) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  655) 			pcon->pc_err = SMT_RDF_NOPARAM ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  656) 			return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  657) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  658) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  659) 	case SMT_P2034 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  660) 	case SMT_P2046 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  661) 	case SMT_P2047 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  662) 	case SMT_P204A :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  663) 	case SMT_P2051 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  664) 	case SMT_P2052 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  665) 		mac_update_counter(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  666) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  667) 	case SMT_P4022:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  668) 		mib_p->fddiPORTPC_LS = LS2MIB(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  669) 			sm_pm_get_ls(smc,port_to_mib(smc,port))) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  670) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  671) 	case SMT_P_REASON :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  672) 		*(u32 *)to = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  673) 		sp_len = 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  674) 		goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  675) 	case SMT_P1033 :			/* time stamp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  676) 		smt_set_timestamp(smc,smc->mib.fddiSMTTimeStamp) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  677) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  678) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  679) 	case SMT_P1020:				/* port indexes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  680) #if	NUMPHYS == 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  681) 		swap = "IIIIIIIIIIII" ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  682) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  683) #if	NUMPHYS == 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  684) 		if (smc->s.sas == SMT_SAS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  685) 			swap = "I" ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  686) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  687) 			swap = "II" ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  688) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  689) #if	NUMPHYS == 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  690) 		swap = "IIIIIIIIIIIIIIIIIIIIIIII" ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  691) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  692) 	????
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  693) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  694) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  695) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  696) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  697) 	case SMT_P3212 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  698) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  699) 			sp_len = cem_build_path(smc,to,path) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  700) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  701) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  702) 	case SMT_P1048 :		/* peer wrap condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  703) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  704) 			struct smt_p_1048	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  705) 			sp = (struct smt_p_1048 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  706) 			sp->p1048_flag = smc->mib.fddiSMTPeerWrapFlag ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  707) 			sp->p1048_cf_state = smc->mib.fddiSMTCF_State ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  708) 			sp_len = sizeof(struct smt_p_1048) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  709) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  710) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  711) 	case SMT_P208C :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  712) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  713) 			struct smt_p_208c	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  714) 			sp = (struct smt_p_208c *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  715) 			sp->p208c_flag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  716) 				smc->mib.m[MAC0].fddiMACDuplicateAddressCond ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  717) 			sp->p208c_dupcondition =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  718) 				(mib_m->fddiMACDA_Flag ? SMT_ST_MY_DUPA : 0) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  719) 				(mib_m->fddiMACUNDA_Flag ? SMT_ST_UNA_DUPA : 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  720) 			sp->p208c_fddilong =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  721) 				mib_m->fddiMACSMTAddress ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  722) 			sp->p208c_fddiunalong =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  723) 				mib_m->fddiMACUpstreamNbr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  724) 			sp->p208c_pad = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  725) 			sp_len = sizeof(struct smt_p_208c) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  726) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  727) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  728) 	case SMT_P208D :		/* frame error condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  729) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  730) 			struct smt_p_208d	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  731) 			sp = (struct smt_p_208d *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  732) 			sp->p208d_flag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  733) 				mib_m->fddiMACFrameErrorFlag ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  734) 			sp->p208d_frame_ct =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  735) 				mib_m->fddiMACFrame_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  736) 			sp->p208d_error_ct =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  737) 				mib_m->fddiMACError_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  738) 			sp->p208d_lost_ct =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  739) 				mib_m->fddiMACLost_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  740) 			sp->p208d_ratio =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  741) 				mib_m->fddiMACFrameErrorRatio ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  742) 			sp_len = sizeof(struct smt_p_208d) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  743) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  744) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  745) 	case SMT_P208E :		/* not copied condition */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  746) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  747) 			struct smt_p_208e	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  748) 			sp = (struct smt_p_208e *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  749) 			sp->p208e_flag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  750) 				mib_m->fddiMACNotCopiedFlag ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  751) 			sp->p208e_not_copied =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  752) 				mib_m->fddiMACNotCopied_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  753) 			sp->p208e_copied =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  754) 				mib_m->fddiMACCopied_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  755) 			sp->p208e_not_copied_ratio =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  756) 				mib_m->fddiMACNotCopiedRatio ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  757) 			sp_len = sizeof(struct smt_p_208e) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  758) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  759) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  760) 	case SMT_P208F :	/* neighbor change event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  761) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  762) 			struct smt_p_208f	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  763) 			sp = (struct smt_p_208f *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  764) 			sp->p208f_multiple =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  765) 				mib_m->fddiMACMultiple_N ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  766) 			sp->p208f_nacondition =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  767) 				mib_m->fddiMACDuplicateAddressCond ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  768) 			sp->p208f_old_una =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  769) 				mib_m->fddiMACOldUpstreamNbr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  770) 			sp->p208f_new_una =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  771) 				mib_m->fddiMACUpstreamNbr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  772) 			sp->p208f_old_dna =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  773) 				mib_m->fddiMACOldDownstreamNbr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  774) 			sp->p208f_new_dna =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  775) 				mib_m->fddiMACDownstreamNbr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  776) 			sp->p208f_curren_path =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  777) 				mib_m->fddiMACCurrentPath ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  778) 			sp->p208f_smt_address =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  779) 				mib_m->fddiMACSMTAddress ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  780) 			sp_len = sizeof(struct smt_p_208f) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  781) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  782) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  783) 	case SMT_P2090 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  784) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  785) 			struct smt_p_2090	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  786) 			sp = (struct smt_p_2090 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  787) 			sp->p2090_multiple =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  788) 				mib_m->fddiMACMultiple_P ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  789) 			sp->p2090_availablepaths =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  790) 				mib_m->fddiMACAvailablePaths ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  791) 			sp->p2090_currentpath =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  792) 				mib_m->fddiMACCurrentPath ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  793) 			sp->p2090_requestedpaths =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  794) 				mib_m->fddiMACRequestedPaths ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  795) 			sp_len = sizeof(struct smt_p_2090) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  796) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  797) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  798) 	case SMT_P4050 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  799) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  800) 			struct smt_p_4050	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  801) 			sp = (struct smt_p_4050 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  802) 			sp->p4050_flag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  803) 				mib_p->fddiPORTLerFlag ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  804) 			sp->p4050_pad = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  805) 			sp->p4050_cutoff =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  806) 				mib_p->fddiPORTLer_Cutoff ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  807) 			sp->p4050_alarm =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  808) 				mib_p->fddiPORTLer_Alarm ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  809) 			sp->p4050_estimate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  810) 				mib_p->fddiPORTLer_Estimate ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  811) 			sp->p4050_reject_ct =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  812) 				mib_p->fddiPORTLem_Reject_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  813) 			sp->p4050_ct =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  814) 				mib_p->fddiPORTLem_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  815) 			sp_len = sizeof(struct smt_p_4050) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  816) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  817) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  818) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  819) 	case SMT_P4051 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  820) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  821) 			struct smt_p_4051	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  822) 			sp = (struct smt_p_4051 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  823) 			sp->p4051_multiple =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  824) 				mib_p->fddiPORTMultiple_U ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  825) 			sp->p4051_porttype =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  826) 				mib_p->fddiPORTMy_Type ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  827) 			sp->p4051_connectstate =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  828) 				mib_p->fddiPORTConnectState ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  829) 			sp->p4051_pc_neighbor =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  830) 				mib_p->fddiPORTNeighborType ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  831) 			sp->p4051_pc_withhold =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  832) 				mib_p->fddiPORTPC_Withhold ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  833) 			sp_len = sizeof(struct smt_p_4051) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  834) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  835) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  836) 	case SMT_P4052 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  837) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  838) 			struct smt_p_4052	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  839) 			sp = (struct smt_p_4052 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  840) 			sp->p4052_flag =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  841) 				mib_p->fddiPORTEB_Condition ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  842) 			sp->p4052_eberrorcount =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  843) 				mib_p->fddiPORTEBError_Ct ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  844) 			sp_len = sizeof(struct smt_p_4052) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  845) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  846) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  847) 	case SMT_P4053 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  848) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  849) 			struct smt_p_4053	*sp ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  850) 			sp = (struct smt_p_4053 *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  851) 			sp->p4053_multiple =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  852) 				mib_p->fddiPORTMultiple_P ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  853) 			sp->p4053_availablepaths =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  854) 				mib_p->fddiPORTAvailablePaths ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  855) 			sp->p4053_currentpath =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  856) 				mib_p->fddiPORTCurrentPath ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  857) 			memcpy(	(char *) &sp->p4053_requestedpaths,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  858) 				(char *) mib_p->fddiPORTRequestedPaths,4) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  859) 			sp->p4053_mytype =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  860) 				mib_p->fddiPORTMy_Type ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  861) 			sp->p4053_neighbortype =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  862) 				mib_p->fddiPORTNeighborType ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  863) 			sp_len = sizeof(struct smt_p_4053) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  864) 			goto sp_done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  865) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  866) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  867) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  868) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  869) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  870) 	 * in table ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  871) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  872) 	if (!pt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  873) 		pcon->pc_err = (para & 0xff00) ? SMT_RDF_NOPARAM :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  874) 						SMT_RDF_ILLEGAL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  875) 		return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  876) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  877) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  878) 	 * check access rights
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  879) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  880) 	switch (pt->p_access) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  881) 	case AC_G :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  882) 	case AC_GR :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  883) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  884) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  885) 		pcon->pc_err = SMT_RDF_ILLEGAL ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  886) 		return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  887) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  888) 	from = mib_addr + pt->p_offset ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  889) 	if (!swap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  890) 		swap = pt->p_swap ;		/* pointer to swap string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  891) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  892) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  893) 	 * copy values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  894) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  895) 	while ((c = *swap++)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  896) 		switch(c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  897) 		case 'b' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  898) 		case 'w' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  899) 		case 'l' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  900) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  901) 		case 'S' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  902) 		case 'E' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  903) 		case 'R' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  904) 		case 'r' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  905) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  906) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  907) 			to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  908) 			to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  909) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  910) 			if (c == 'r') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  911) 				to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  912) 				to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  913) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  914) 			else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  915) 				to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  916) 				to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  917) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  918) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  919) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  920) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  921) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  922) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  923) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  924) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  925) 		case 'I' :		/* for SET of port indexes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  926) 			if (len < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  927) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  928) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  929) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  930) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  931) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  932) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  933) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  934) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  935) 			to += 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  936) 			len -= 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  937) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  938) 		case 'F' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  939) 		case 'B' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  940) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  941) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  942) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  943) 			to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  944) 			to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  945) 			to[2] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  946) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  947) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  948) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  949) 		case 'C' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  950) 		case 'T' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  951) 		case 'L' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  952) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  953) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  954) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  955) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  956) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  957) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  958) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  959) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  960) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  961) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  962) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  963) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  964) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  965) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  966) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  967) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  968) 		case '2' :		/* PortMacIndicated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  969) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  970) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  971) 			to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  972) 			to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  973) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  974) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  975) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  976) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  977) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  978) 		case '4' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  979) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  980) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  981) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  982) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  983) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  984) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  985) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  986) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  987) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  988) 		case 'A' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  989) 			if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  990) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  991) 			to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  992) 			to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  993) 			memcpy((char *) to+2,(char *) from,6) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  994) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  995) 			from += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  996) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  997) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  998) 		case '8' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  999) 			if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) 			memcpy((char *) to,(char *) from,8) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) 			from += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) 		case 'D' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) 			if (len < 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) 			memcpy((char *) to,(char *) from,32) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) 			to += 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) 			from += 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) 			len -= 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) 		case 'P' :		/* timestamp is NOT swapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) 			if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) 			to[4] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) 			to[5] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) 			to[6] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) 			to[7] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) 		default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) 			SMT_PANIC(smc,SMT_E0119, SMT_E0119_MSG) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) 	 * make it even (in case of 'I' encoding)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) 	 * note: len is DECREMENTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) 	if (len & 3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) 		to[0] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) 		to[1] = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) 		to += 4 - (len & 3 ) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) 		len = len & ~ 3 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) 	/* set type and length */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) 	pa->p_type = para ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) 	pa->p_len = plen - len - PARA_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) 	/* return values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) 	pcon->pc_p = (void *) to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) 	pcon->pc_len = len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) 	return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) sp_done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) 	len -= sp_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) 	to += sp_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) 	goto done ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) len_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) 	/* parameter does not fit in frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) 	pcon->pc_err = SMT_RDF_TOOLONG ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) 	return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) wrong_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) 	pcon->pc_err = SMT_RDF_LENGTH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)  * set parameter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) static int smt_set_para(struct s_smc *smc, struct smt_para *pa, int index,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) 			int local, int set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) #define IFSET(x)	if (set) (x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) 	const struct s_p_tab	*pt ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) 	int		len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) 	char		*from ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) 	char		*to ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) 	const char	*swap ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) 	char		c ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) 	char		*mib_addr ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) 	struct fddi_mib	*mib ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) 	struct fddi_mib_m	*mib_m = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) 	struct fddi_mib_a	*mib_a = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) 	struct fddi_mib_p	*mib_p = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) 	int		mac ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) 	int		path ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) 	int		port ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) 	SK_LOC_DECL(u_char,byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) 	SK_LOC_DECL(u_short,word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) 	SK_LOC_DECL(u_long,long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) 	mac = index - INDEX_MAC ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) 	path = index - INDEX_PATH ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) 	port = index - INDEX_PORT ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) 	len = pa->p_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) 	from = (char *) (pa + 1 ) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) 	mib = &smc->mib ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) 	switch (pa->p_type & 0xf000) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) 	case 0x1000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) 		mib_addr = (char *) mib ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) 	case 0x2000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) 		if (mac < 0 || mac >= NUMMACS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) 			return SMT_RDF_NOPARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) 		mib_m = &smc->mib.m[mac] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) 		mib_addr = (char *) mib_m ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) 		from += 4 ;		/* skip index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) 		len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) 	case 0x3000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) 		if (path < 0 || path >= NUMPATHS) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) 			return SMT_RDF_NOPARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) 		mib_a = &smc->mib.a[path] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) 		mib_addr = (char *) mib_a ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) 		from += 4 ;		/* skip index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) 		len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) 	case 0x4000 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) 		if (port < 0 || port >= smt_mib_phys(smc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) 			return SMT_RDF_NOPARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) 		mib_p = &smc->mib.p[port_to_mib(smc,port)] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) 		mib_addr = (char *) mib_p ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) 		from += 4 ;		/* skip index */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) 		len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) 	switch (pa->p_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) 	case SMT_P10F0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) 	case SMT_P10F1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) 	case SMT_P10F2 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) 	case SMT_P10F3 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) 	case SMT_P10F4 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) 	case SMT_P10F5 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) 	case SMT_P10F6 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) 	case SMT_P10F7 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) #ifdef	SBA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) 	case SMT_P10F8 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) 	case SMT_P10F9 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) 	case SMT_P20F1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) 		if (!local)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) 			return SMT_RDF_NOPARAM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) 	pt = smt_get_ptab(pa->p_type) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) 	if (!pt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) 		return (pa->p_type & 0xff00) ? SMT_RDF_NOPARAM :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) 					       SMT_RDF_ILLEGAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) 	switch (pt->p_access) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) 	case AC_GR :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) 	case AC_S :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) 		return SMT_RDF_ILLEGAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) 	to = mib_addr + pt->p_offset ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) 	swap = pt->p_swap ;		/* pointer to swap string */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) 	while (swap && (c = *swap++)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) 		switch(c) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) 		case 'b' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) 			to = (char *) &byte_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) 		case 'w' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) 			to = (char *) &word_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) 		case 'l' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) 			to = (char *) &long_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) 		case 'S' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) 		case 'E' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) 		case 'R' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) 		case 'r' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) 			if (len < 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) 			if (from[0] | from[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) 				goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) 			if (c == 'r') {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) 				to[0] = from[2] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) 				to[1] = from[3] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) 			else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) 				to[1] = from[2] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) 				to[0] = from[3] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) 			to[0] = from[2] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) 			to[1] = from[3] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) 			from += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) 			to += 2 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) 		case 'F' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) 		case 'B' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) 			if (len < 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) 			if (from[0] | from[1] | from[2])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) 				goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) 			to[0] = from[3] ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) 			from += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) 		case 'C' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) 		case 'T' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) 		case 'L' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) 			if (len < 4) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) 			to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) 			to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) 			to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) 			to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) 		case 'A' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) 			if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) 			if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) 				memcpy(to,from+2,6) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) 			from += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) 		case '4' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) 			if (len < 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) 			if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) 				memcpy(to,from,4) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) 			to += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) 			from += 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) 			len -= 4 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) 		case '8' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) 			if (len < 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) 			if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) 				memcpy(to,from,8) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) 			from += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) 		case 'D' :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) 			if (len < 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) 				goto len_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) 			if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) 				memcpy(to,from,32) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) 			to += 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) 			from += 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271) 			len -= 32 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) 		case 'P' :		/* timestamp is NOT swapped */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) 			if (set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) 				to[0] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) 				to[1] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) 				to[2] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) 				to[3] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) 				to[4] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) 				to[5] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) 				to[6] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) 				to[7] = *from++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) 			to += 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) 			len -= 8 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) 		default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) 			SMT_PANIC(smc,SMT_E0120, SMT_E0120_MSG) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) 			return SMT_RDF_ILLEGAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) 	 * actions and internal updates
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) 	switch (pa->p_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) 	case SMT_P101A:			/* fddiSMTConfigPolicy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) 		if (word_val & ~1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) 		IFSET(mib->fddiSMTConfigPolicy = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) 	case SMT_P101B :		/* fddiSMTConnectionPolicy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) 		if (!(word_val & POLICY_MM))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) 		IFSET(mib->fddiSMTConnectionPolicy = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) 	case SMT_P101D : 		/* fddiSMTTT_Notify */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) 		if (word_val < 2 || word_val > 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) 		IFSET(mib->fddiSMTTT_Notify = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) 	case SMT_P101E :		/* fddiSMTStatRptPolicy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) 		if (byte_val & ~1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) 		IFSET(mib->fddiSMTStatRptPolicy = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) 	case SMT_P101F :		/* fddiSMTTrace_MaxExpiration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) 		/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) 		 * note: lower limit trace_max = 6.001773... s
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) 		 * NO upper limit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) 		if (long_val < (long)0x478bf51L)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) 		IFSET(mib->fddiSMTTrace_MaxExpiration = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) 	case SMT_P10F2 :		/* fddiESSPayload */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) 		if (long_val > 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) 		if (set && smc->mib.fddiESSPayload != long_val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) 			smc->ess.raf_act_timer_poll = TRUE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) 			smc->mib.fddiESSPayload = long_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) 	case SMT_P10F3 :		/* fddiESSOverhead */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) 		if (long_val < 50 || long_val > 5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) 		if (set && smc->mib.fddiESSPayload &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) 			smc->mib.fddiESSOverhead != long_val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) 			smc->ess.raf_act_timer_poll = TRUE ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) 			smc->mib.fddiESSOverhead = long_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) 	case SMT_P10F4 :		/* fddiESSMaxTNeg */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) 		if (long_val > -MS2BCLK(5) || long_val < -MS2BCLK(165))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) 		IFSET(mib->fddiESSMaxTNeg = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) 	case SMT_P10F5 :		/* fddiESSMinSegmentSize */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) 		if (long_val < 1 || long_val > 4478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) 		IFSET(mib->fddiESSMinSegmentSize = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) 	case SMT_P10F6 :		/* fddiESSCategory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) 		if ((long_val & 0xffff) != 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) 		IFSET(mib->fddiESSCategory = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) 	case SMT_P10F7 :		/* fddiESSSyncTxMode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) 		if (word_val > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) 		IFSET(mib->fddiESSSynchTxMode = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) #ifdef	SBA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) 	case SMT_P10F8 :		/* fddiSBACommand */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) 		if (byte_val != SB_STOP && byte_val != SB_START)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) 		IFSET(mib->fddiSBACommand = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) 	case SMT_P10F9 :		/* fddiSBAAvailable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) 		if (byte_val > 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) 		IFSET(mib->fddiSBAAvailable = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) 	case SMT_P2020 :		/* fddiMACRequestedPaths */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) 		if ((word_val & (MIB_P_PATH_PRIM_PREFER |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) 			MIB_P_PATH_PRIM_ALTER)) == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) 		IFSET(mib_m->fddiMACRequestedPaths = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) 	case SMT_P205F :		/* fddiMACFrameErrorThreshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) 		/* 0 .. ffff acceptable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) 		IFSET(mib_m->fddiMACFrameErrorThreshold = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) 	case SMT_P2067 :		/* fddiMACNotCopiedThreshold */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) 		/* 0 .. ffff acceptable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388) 		IFSET(mib_m->fddiMACNotCopiedThreshold = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) 	case SMT_P2076:			/* fddiMACMA_UnitdataEnable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) 		if (byte_val & ~1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393) 		if (set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) 			mib_m->fddiMACMA_UnitdataEnable = byte_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) 			queue_event(smc,EVENT_RMT,RM_ENABLE_FLAG) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) 	case SMT_P20F1 :		/* fddiMACT_Min */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) 		IFSET(mib_m->fddiMACT_Min = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) 	case SMT_P320F :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) 		if (long_val > 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) 		IFSET(mib_a->fddiPATHSbaPayload = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) 		if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) 			ess_para_change(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) 	case SMT_P3210 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) 		if (long_val > 5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) 		
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) 		if (long_val != 0 && mib_a->fddiPATHSbaPayload == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417) 		IFSET(mib_a->fddiPATHSbaOverhead = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) #ifdef	ESS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) 		if (set)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) 			ess_para_change(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) 	case SMT_P3213:			/* fddiPATHT_Rmode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) 		/* no limit :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) 		 * 0 .. 343.597 => 0 .. 2e32 * 80nS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) 		if (set) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) 			mib_a->fddiPATHT_Rmode = long_val ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) 			rtm_set_timer(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) 	case SMT_P3214 :		/* fddiPATHSbaAvailable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) 		if (long_val > 0x00BEBC20L)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) #ifdef SBA 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436) 		if (set && mib->fddiSBACommand == SB_STOP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) 		IFSET(mib_a->fddiPATHSbaAvailable = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) 	case SMT_P3215 :		/* fddiPATHTVXLowerBound */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) 		IFSET(mib_a->fddiPATHTVXLowerBound = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) 		goto change_mac_para ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) 	case SMT_P3216 :		/* fddiPATHT_MaxLowerBound */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) 		IFSET(mib_a->fddiPATHT_MaxLowerBound = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) 		goto change_mac_para ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) 	case SMT_P3217 :		/* fddiPATHMaxT_Req */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) 		IFSET(mib_a->fddiPATHMaxT_Req = long_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) change_mac_para:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) 		if (set && smt_set_mac_opvalues(smc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) 			RS_SET(smc,RS_EVENT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) 			smc->sm.please_reconnect = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) 			queue_event(smc,EVENT_ECM,EC_DISCONNECT) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) 	case SMT_P400E :		/* fddiPORTConnectionPolicies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) 		if (byte_val > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) 		IFSET(mib_p->fddiPORTConnectionPolicies = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) 	case SMT_P4011 :		/* fddiPORTRequestedPaths */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) 		/* all 3*8 bits allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) 		IFSET(memcpy((char *)mib_p->fddiPORTRequestedPaths,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) 			(char *)&long_val,4)) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) 	case SMT_P401F:			/* fddiPORTMaint_LS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) 		if (word_val > 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) 		IFSET(mib_p->fddiPORTMaint_LS = word_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) 	case SMT_P403A :		/* fddiPORTLer_Cutoff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) 		if (byte_val < 4 || byte_val > 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) 		IFSET(mib_p->fddiPORTLer_Cutoff = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) 	case SMT_P403B :		/* fddiPORTLer_Alarm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) 		if (byte_val < 4 || byte_val > 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) 		IFSET(mib_p->fddiPORTLer_Alarm = byte_val) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) 	 * Actions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) 	case SMT_P103C :		/* fddiSMTStationAction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) 		if (smt_action(smc,SMT_STATION_ACTION, (int) word_val, 0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) 	case SMT_P4046:			/* fddiPORTAction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) 		if (smt_action(smc,SMT_PORT_ACTION, (int) word_val,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) 			port_to_mib(smc,port)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) 			goto val_error ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) 	default :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) 		break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) val_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) 	/* parameter value in frame is out of range */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) 	return SMT_RDF_RANGE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) len_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) 	/* parameter value in frame is too short */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) 	return SMT_RDF_LENGTH;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) #if	0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) no_author_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) 	/* parameter not setable, because the SBA is not active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511) 	 * Please note: we give the return code 'not authorizeed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) 	 *  because SBA denied is not a valid return code in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) 	 * PMF protocol.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) 	return SMT_RDF_AUTHOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) static const struct s_p_tab *smt_get_ptab(u_short para)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) 	const struct s_p_tab	*pt ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) 	for (pt = p_tab ; pt->p_num && pt->p_num != para ; pt++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) 		;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) 	return pt->p_num ? pt : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) static int smt_mib_phys(struct s_smc *smc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) #ifdef	CONCENTRATOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) 	SK_UNUSED(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) 	return NUMPHYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) 	if (smc->s.sas == SMT_SAS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) 		return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) 	return NUMPHYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) static int port_to_mib(struct s_smc *smc, int p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) #ifdef	CONCENTRATOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) 	SK_UNUSED(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) 	return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) 	if (smc->s.sas == SMT_SAS)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) 		return PS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) 	return p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) #ifdef	DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) #ifndef	BOOT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) void dump_smt(struct s_smc *smc, struct smt_header *sm, char *text)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) 	int	len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) 	struct smt_para	*pa ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) 	char	*c ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) 	int	n ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) 	int	nn ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) 	int	smtlen ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) 	SK_UNUSED(smc) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) #ifdef	DEBUG_BRD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) 	if (smc->debug.d_smtf < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) 	if (debug.d_smtf < 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) 		return ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) 	smtlen = sm->smt_len + sizeof(struct smt_header) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) 	printf("SMT Frame [%s]:\nDA  ",text) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) 	dump_hex((char *) &sm->smt_dest,6) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) 	printf("\tSA ") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) 	dump_hex((char *) &sm->smt_source,6) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) 	printf(" Class %x Type %x Version %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) 		sm->smt_class,sm->smt_type,sm->smt_version)  ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) 	printf("TID %x\t\tSID ", sm->smt_tid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) 	dump_hex((char *) &sm->smt_sid,8) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) 	printf(" LEN %x\n",sm->smt_len) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) 	len = sm->smt_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) 	pa = (struct smt_para *) (sm + 1) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) 	while (len > 0 ) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) 		int	plen ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) #ifdef UNIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) 		printf("TYPE %x LEN %x VALUE\t",pa->p_type,pa->p_len) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) 		printf("TYPE %04x LEN %2x VALUE\t",pa->p_type,pa->p_len) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) 		n = pa->p_len ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) 		if ( (n < 0 ) || (n > (int)(len - PARA_LEN))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) 			n = len - PARA_LEN ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) 			printf(" BAD LENGTH\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) 			break ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) 		smt_swap_para(sm,smtlen,0) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) 		if (n < 24) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) 			dump_hex((char *)(pa+1),(int) n) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) 			printf("\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) 		else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) 			int	first = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) 			c = (char *)(pa+1) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) 			dump_hex(c,16) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) 			printf("\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) 			n -= 16 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) 			c += 16 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) 			while (n > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) 				nn = (n > 16) ? 16 : n ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619) 				if (n > 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) 					if (first == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) 						printf("\t\t\t...\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) 					first = 1 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) 				else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) 					printf("\t\t\t") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) 					dump_hex(c,nn) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627) 					printf("\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) 				n -= nn ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) 				c += 16 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) #ifdef	LITTLE_ENDIAN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) 		smt_swap_para(sm,smtlen,1) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) 		plen = (pa->p_len + PARA_LEN + 3) & ~3 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) 		len -= plen ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638) 		pa = (struct smt_para *)((char *)pa + plen) ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) 	printf("-------------------------------------------------\n\n") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) void dump_hex(char *p, int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) 	int	n = 0 ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) 	while (len--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) 		n++ ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) #ifdef UNIX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) 		printf("%x%s",*p++ & 0xff,len ? ( (n & 7) ? " " : "-") : "") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) 		printf("%02x%s",*p++ & 0xff,len ? ( (n & 7) ? " " : "-") : "") ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) #endif	/* no BOOT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) #endif	/* DEBUG */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) #endif	/* no SLIM_SMT */