xref: /csrg-svn/contrib/usr.x25/x25config.c (revision 59259)
145189Ssklower /*
248848Ssklower  * Copyright (c) 1990 The Regents of the University of California.
348848Ssklower  * All rights reserved.
448848Ssklower  *
548848Ssklower  * %sccs.include.redist.c%
648848Ssklower  *
7*59259Ssklower  *	@(#)x25config.c	5.3 (Berkeley) 04/25/93
848848Ssklower  */
948848Ssklower /*
1045189Ssklower  * Configure X.25 interface
1145189Ssklower  *
1245189Ssklower  * Copyright (c) 1986 University of British Columbia
1345189Ssklower  *
1445189Ssklower  * Frank Pronk
1545189Ssklower  * February 1986
1645189Ssklower  */
1745189Ssklower 
1845189Ssklower #include <sys/types.h>
1945189Ssklower #include <sys/socket.h>
2045189Ssklower #include <sys/ioctl.h>
2145189Ssklower 
2245189Ssklower #include <net/if.h>
2345189Ssklower #include <netccitt/x25.h>
2445189Ssklower 
2545189Ssklower #include <stdio.h>
2645189Ssklower #include <netdb.h>
2745189Ssklower 
2845189Ssklower #define	IFFBITS \
2945189Ssklower "\020\1UP\2BROADCAST\3DEBUG\4ROUTE\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP"
3045189Ssklower 
3145189Ssklower int	setifflags (), setdefault (), setnet (), setntn ();
32*59259Ssklower int	setlproto (), sethdlc (), setlwsize (), setlkeepalive (), setltrace ();
3345189Ssklower int	setyear (), setpwsize (), setpacketsize (), setmaxlcn (), setptrace ();
3445189Ssklower 
3545189Ssklower struct	cmd {
3645189Ssklower 	char	*c_name;
3745189Ssklower 	int	c_arg;
3845189Ssklower 	int	(*c_func) ();
3945189Ssklower } cmds[] = {
4045189Ssklower 	"up",		IFF_UP,			setifflags,
4145189Ssklower 	"-up",		-IFF_UP,		setifflags,
4245189Ssklower 	"down",		-IFF_UP,		setifflags,
4345189Ssklower 	"debug",	IFF_DEBUG,		setifflags,
4445189Ssklower 	"-debug",	-IFF_DEBUG,		setifflags,
4545189Ssklower 	"default",	0,			setdefault,
4645189Ssklower 	"hdlc",		CCITTPROTO_HDLC,	setlproto,
4745189Ssklower 	"ieee802llc",	IEEEPROTO_802LLC,	setlproto,
48*59259Ssklower 	"llc2",		IEEEPROTO_802LLC,	setlproto,
4945189Ssklower 	"lap",		HDLCPROTO_LAP,		sethdlc,
5045189Ssklower 	"lapb",		HDLCPROTO_LAPB,		sethdlc,
5145189Ssklower 	"lapd",		HDLCPROTO_LAPD,		sethdlc,
5245189Ssklower 	"unset",	HDLCPROTO_UNSET,	sethdlc,
5345189Ssklower 	"-ltrace",	0,			setltrace,
5445189Ssklower 	"ltrace",	1,			setltrace,
55*59259Ssklower 	"keepalive",	1,			setlkeepalive,
56*59259Ssklower 	"-keepalive",	0,			setlkeepalive,
5745189Ssklower 
5845189Ssklower 	"1976",		X25_1976,		setyear,
5945189Ssklower 	"1980",		X25_1980,		setyear,
6045189Ssklower 	"1984",		X25_1984,		setyear,
6145189Ssklower 	"-ptrace",	0,			setptrace,
6245189Ssklower 	"ptrace",	1,			setptrace,
6345189Ssklower 
6445189Ssklower 	"-net",		0,			setnet,
6545189Ssklower 	"-ntn",		0,			setntn,
6645189Ssklower 	"-lwsize",	0,			setlwsize,
6745189Ssklower 	"-pwsize",	0,			setpwsize,
6845189Ssklower 	"-psize",	0,			setpacketsize,
6945189Ssklower 	"-maxlcn",	0,			setmaxlcn,
7045189Ssklower 	0,		0,			0
7145189Ssklower };
7245189Ssklower 
7345189Ssklower struct	ifreq ifr;
7448848Ssklower struct	ifreq_x25 ifrx25;
7548848Ssklower #define x25conf ifrx25.ifr_xc
7645189Ssklower 
7745189Ssklower char	*myname;
7845189Ssklower char	*ifname;	/* interface name */
7945189Ssklower short	ifflags;	/* local copy of interface flags */
8045189Ssklower 
main(argc,argv)8145189Ssklower main (argc, argv)
8245189Ssklower register char **argv;
8345189Ssklower int argc;
8445189Ssklower {
8545189Ssklower 	register int s;
8645189Ssklower 
8745189Ssklower 	myname = *argv;
8845189Ssklower 	if (argc < 2)
8945189Ssklower 		abort ("usage: x25ifconfig interface [default] [-net net] [-ntn ntn] [-maxlcn maxlcn] [up] [down] [zillions of other options]");
9045189Ssklower 
9145189Ssklower 	if ((s = socket (AF_CCITT, SOCK_STREAM, 0)) < 0)
9245189Ssklower 		syserr ("socket");
9345189Ssklower 	argv[argc] = 0;
9445189Ssklower 	argv++;
9545189Ssklower 
9645189Ssklower 	ifname = *argv;
9745189Ssklower 	strcpy (ifr.ifr_name, ifname);
9845189Ssklower 	if (ioctl (s, SIOCGIFFLAGS, (char *)&ifr) < 0)
9945189Ssklower 		syserr ("ioctl (SIOCGIFFLAGS)");
10045189Ssklower 	ifflags = ifr.ifr_flags;
10148848Ssklower 	strcpy (ifrx25.ifr_name, ifname);
10248848Ssklower 	if (ioctl (s, SIOCGIFCONF_X25, (char *)&ifrx25) < 0) {
10348848Ssklower 		x25conf.xc_addr.x25_len = sizeof(x25conf);
10448848Ssklower 		x25conf.xc_addr.x25_family = AF_CCITT;
10548848Ssklower 	}
10645189Ssklower 	if (argc == 2) {
10745189Ssklower 		status ();
10845189Ssklower 		exit (0);
10945189Ssklower 	}
11045189Ssklower 	argv++;
11145189Ssklower 	while (*argv) {
11245189Ssklower 		register struct cmd *cp;
11345189Ssklower 		register int argneeded;
11445189Ssklower 
11545189Ssklower 		argneeded = 0;
11645189Ssklower 		for (cp = cmds; ; cp++) {
11745189Ssklower 			if (cp->c_name == 0)
11845189Ssklower 				abort ("invalid argument: %s", *argv);
11945189Ssklower 			if (cp->c_func == setnet)
12045189Ssklower 				argneeded++;
12145189Ssklower 			if (strcmp (cp->c_name, *argv) == 0) {
12245189Ssklower 				if (argneeded) {
12345189Ssklower 					if (argv[1]) {
12445189Ssklower 						argv++;
12545189Ssklower 						(*cp->c_func) (*argv);
12645189Ssklower 					} else
12745189Ssklower 						abort ("argument expect after %s", *argv);
12845189Ssklower 				} else
12945189Ssklower 					(*cp->c_func) (cp->c_arg);
13045189Ssklower 				break;
13145189Ssklower 			}
13245189Ssklower 		}
13345189Ssklower 		argv++;
13445189Ssklower 	}
13545189Ssklower 	ifr.ifr_flags = ifflags;
13645189Ssklower 	strcpy (ifr.ifr_name, ifname);
13745189Ssklower 	if (ioctl (s, SIOCSIFFLAGS, (char *)&ifr) < 0)
13845189Ssklower 		syserr ("ioctl (SIOCSIFFLAGS)");
13945189Ssklower 
14048848Ssklower 	strcpy (ifrx25.ifr_name, ifname);
14148848Ssklower 	if (ioctl (s, SIOCSIFCONF_X25, (char *)&ifrx25) < 0)
14248848Ssklower 		syserr ("ioctl (SIOCSIFCONF_X25)");
14345189Ssklower 	exit (0);
14445189Ssklower }
14545189Ssklower 
14645189Ssklower /* VARARGS */
abort(fmt,a1,a2,a3,a4,a5)14745189Ssklower abort (fmt, a1, a2, a3, a4, a5)
14845189Ssklower char *fmt;
14945189Ssklower {
15045189Ssklower 	char buf[128];
15145189Ssklower 
15245189Ssklower 	sprintf (buf, "%s: %s\n", myname, fmt);
15345189Ssklower 	fprintf (stderr, buf, a1, a2, a3, a4, a5);
15445189Ssklower 	exit (1);
15545189Ssklower }
15645189Ssklower 
15745189Ssklower /* VARARGS */
syserr(fmt,a1,a2,a3,a4,a5)15845189Ssklower syserr (fmt, a1, a2, a3, a4, a5)
15945189Ssklower char *fmt;
16045189Ssklower {
16145189Ssklower 	char buf[128];
16245189Ssklower 	extern int errno;
16345189Ssklower 	extern char *sys_errlist[];
16445189Ssklower 
16545189Ssklower 	sprintf (buf, "%s: %s: %s\n", myname, fmt, sys_errlist[errno]);
16645189Ssklower 	fprintf (stderr, buf, a1, a2, a3, a4, a5);
16745189Ssklower 	exit (1);
16845189Ssklower }
16945189Ssklower 
status()17045189Ssklower status ()
17145189Ssklower {
17248848Ssklower 	char *addr = x25conf.xc_addr.x25_addr;
17345189Ssklower 
17445189Ssklower 	printf ("%s: ", ifname);
17545189Ssklower 	printb ("interface flags", ifflags, IFFBITS);
17645189Ssklower 	printf ("link level:\n");
17745189Ssklower 	printf ("\twindow size: %d\n", x25conf.xc_lwsize);
17845189Ssklower 	if (x25conf.xc_ltrace)
17945189Ssklower 		printf ("\ttracing: on\n");
18045189Ssklower 	printf ("\npacket level:\n");
18148848Ssklower 	printf ("\taddress: %04d %s\n", x25conf.xc_addr.x25_net, addr);
18245189Ssklower 	printf ("\twindow size: %d\n", x25conf.xc_pwsize);
18345189Ssklower 	printf ("\tpacket size: %d\n", 1 << x25conf.xc_psize);
18445189Ssklower 	printf ("\tmax lcn: %d\n", x25conf.xc_maxlcn);
18545189Ssklower 	if (x25conf.xc_ptrace)
18645189Ssklower 		printf ("\ttracing: on\n");
18745189Ssklower }
18845189Ssklower 
setifflags(value)18945189Ssklower setifflags (value)
19045189Ssklower {
19145189Ssklower 
19245189Ssklower 	if (value < 0) {
19345189Ssklower 		value = -value;
19445189Ssklower 		ifflags &= ~value;
19545189Ssklower 	} else
19645189Ssklower 		ifflags |= value;
19745189Ssklower }
19845189Ssklower 
19945189Ssklower /* VARARGS */
setdefault(arg)20045189Ssklower setdefault (arg)
20145189Ssklower {
20245189Ssklower 
20348848Ssklower 	x25conf.xc_addr.x25_family = AF_CCITT;
20445189Ssklower 	x25conf.xc_lproto = CCITTPROTO_HDLC;
20545189Ssklower 	x25conf.xc_lptype = HDLCPROTO_LAPB;
20645189Ssklower 	x25conf.xc_lwsize = 7;
20745189Ssklower 
20845189Ssklower 	x25conf.xc_pwsize = 2;
20945189Ssklower 	x25conf.xc_psize = X25_PS128;
21045189Ssklower 	x25conf.xc_type = X25_1976;
21145189Ssklower }
21245189Ssklower 
setnet(arg)21345189Ssklower setnet (arg)
21445189Ssklower char *arg;
21545189Ssklower {
21645189Ssklower 	register int net;
21745189Ssklower 	register struct netent *np;
21845189Ssklower 
21945189Ssklower 	if (*arg < '0' || *arg > '9') {	/* lookup name in /etc/networks */
22045189Ssklower 		if ((np = getnetbyname (arg)) == 0)
22145189Ssklower 			abort ("unknown network (%s)", arg);
22245189Ssklower 		net = np->n_net;
22345189Ssklower 	} else
22445189Ssklower 		net = atoi (arg);
22548848Ssklower 	x25conf.xc_addr.x25_net = net;
22645189Ssklower }
22745189Ssklower 
setntn(arg)22845189Ssklower setntn (arg)
22945189Ssklower register char *arg;
23045189Ssklower {
23145189Ssklower 	register int l;
23245189Ssklower 	register char *p;
23345189Ssklower 	register struct hostent *hp;
23445189Ssklower 	struct hostent *getx25hostbyname ();
23545189Ssklower 
23645189Ssklower 	if (*arg < '0' || *arg > '9') {	/* lookup in /etc/x25hosts */
23745189Ssklower 		if ((hp = getx25hostbyname (arg)) == 0)
23845189Ssklower 			abort ("can't find '%s' in /etc/x25hosts", arg);
23945189Ssklower 		arg = ((struct sockaddr_x25 *)hp->h_addr)->x25_addr;
24048848Ssklower 		l = strlen (arg) + 1;
24145189Ssklower 	} else
24248848Ssklower 		for (l = 1, p = arg; *p; p++) {
24345189Ssklower 			l++;
24445189Ssklower 			if (*p < '0' || *p > '9')
24545189Ssklower 				abort ("invalid character in ntn address");
24645189Ssklower 		}
24748848Ssklower 	if (l > sizeof (x25conf.xc_addr.x25_addr))
24845189Ssklower 		abort ("invalid ntn address");
24948848Ssklower 	bcopy(arg, x25conf.xc_addr.x25_addr, l);
25045189Ssklower }
25145189Ssklower 
to_bcd(src,dest)25245189Ssklower to_bcd (src, dest)
25345189Ssklower register char *src, *dest;
25445189Ssklower {
25545189Ssklower 	register int i;
25645189Ssklower 
25745189Ssklower 	for(i = 0; *src; i++)
25845189Ssklower 		if (i & 0x01 )
25945189Ssklower 			*dest++ |= *src++ & 0x0F;
26045189Ssklower 		else
26145189Ssklower 			*dest = *src++ << 4;
26245189Ssklower }
26345189Ssklower 
from_bcd(src,dest,len)26445189Ssklower from_bcd (src, dest, len)
26545189Ssklower char *src, *dest;
26645189Ssklower {
26745189Ssklower 	register int i;
26845189Ssklower 
26945189Ssklower 	for (i = 0; i < len/2; i++) {
27045189Ssklower 		*dest++ = ((*src & 0xf0) >> 4) + '0';
27145189Ssklower 		*dest++ = (*src++ & 0xf) + '0';
27245189Ssklower 	}
27345189Ssklower 	*dest = 0;
27445189Ssklower }
27545189Ssklower 
setlproto(arg)27645189Ssklower setlproto (arg)
27745189Ssklower {
27845189Ssklower 	x25conf.xc_lproto = arg;
27945189Ssklower }
28045189Ssklower 
sethdlc(arg)28145189Ssklower sethdlc (arg)
28245189Ssklower {
28345189Ssklower 	x25conf.xc_lptype = arg;
28445189Ssklower }
28545189Ssklower 
setlwsize(arg)28645189Ssklower setlwsize (arg)
28745189Ssklower char *arg;
28845189Ssklower {
28945189Ssklower 	register int ws;
29045189Ssklower 
291*59259Ssklower 	if ((ws = atoi (arg)) <= 0 ||
292*59259Ssklower 	    ( ws > 31 && x25conf.xc_lproto != IEEEPROTO_802LLC )
293*59259Ssklower 	    || ws > 127)
29445189Ssklower 		abort ("invalid link level window size");
29545189Ssklower 	x25conf.xc_lwsize = ws;
29645189Ssklower }
29745189Ssklower 
setlkeepalive(arg)298*59259Ssklower setlkeepalive (arg)
299*59259Ssklower int arg;
300*59259Ssklower {
301*59259Ssklower 	/* x25conf.xc_lkeepalive = arg; */
302*59259Ssklower }
303*59259Ssklower 
setltrace(arg)30445189Ssklower setltrace (arg)
30545189Ssklower {
30645189Ssklower 	x25conf.xc_ltrace = arg;
30745189Ssklower }
30845189Ssklower 
setyear(arg)30945189Ssklower setyear (arg)
31045189Ssklower {
31145189Ssklower 	x25conf.xc_type = arg;
31245189Ssklower 	switch (arg) {
31345189Ssklower 	case X25_1976:
31445189Ssklower 		return;
31545189Ssklower 
31645189Ssklower 	case X25_1980:
31745189Ssklower 	case X25_1984:
31845189Ssklower 		x25conf.xc_pwsize = 7;
31945189Ssklower 		x25conf.xc_psize = 12;		/* 4096 bytes */
32045189Ssklower 	}
32145189Ssklower }
32245189Ssklower 
setpwsize(arg)32345189Ssklower setpwsize (arg)
32445189Ssklower char *arg;
32545189Ssklower {
32645189Ssklower 	register int ws;
32745189Ssklower 
32845189Ssklower 	if ((ws = atoi (arg)) <= 0 || ws > 7)
32945189Ssklower 		abort ("invalid packet level window size");
33045189Ssklower 	x25conf.xc_pwsize = ws;
33145189Ssklower }
33245189Ssklower 
setpacketsize(arg)33345189Ssklower setpacketsize (arg)
33445189Ssklower char *arg;
33545189Ssklower {
33645189Ssklower 	register int psize, logpsize = 0;
33745189Ssklower 
33845189Ssklower 	if ((psize = atoi (arg)) < 64 || psize > 4096)
33945189Ssklower 		abort ("invalid packet size");
34045189Ssklower 	while (psize > 1) {
34145189Ssklower 		psize >>= 1;
34245189Ssklower 		logpsize++;
34345189Ssklower 	}
34445189Ssklower 	x25conf.xc_psize = logpsize;
34545189Ssklower }
34645189Ssklower 
setmaxlcn(arg)34745189Ssklower setmaxlcn (arg)
34845189Ssklower char *arg;
34945189Ssklower {
35045189Ssklower 	register int lcn;
35145189Ssklower 
35245189Ssklower 	if ((lcn = atoi (arg)) <= 0)
35345189Ssklower 		abort ("invalid maximum lcn");
35445189Ssklower 	x25conf.xc_maxlcn = lcn;
35545189Ssklower }
35645189Ssklower 
setptrace(arg)35745189Ssklower setptrace (arg)
35845189Ssklower {
35945189Ssklower 	x25conf.xc_ptrace = arg;
36045189Ssklower }
36145189Ssklower 
36245189Ssklower /*
36345189Ssklower  * Print a value a la the %b format of the kernel's printf
36445189Ssklower  */
36545189Ssklower 
printb(s,v,bits)36645189Ssklower printb(s, v, bits)
36745189Ssklower 	char *s;
36845189Ssklower 	register char *bits;
36945189Ssklower 	register unsigned short v;
37045189Ssklower {
37145189Ssklower 	register int i, any = 0;
37245189Ssklower 	register char c;
37345189Ssklower 
37445189Ssklower 	if (bits && *bits == 8)
37545189Ssklower 		printf("%s=%o", s, v);
37645189Ssklower 	else
37745189Ssklower 		printf("%s=%x", s, v);
37845189Ssklower 	bits++;
37945189Ssklower 	if (bits) {
38045189Ssklower 		putchar('<');
38145189Ssklower 		while (i = *bits++) {
38245189Ssklower 			if (v & (1 << (i-1))) {
38345189Ssklower 				if (any)
38445189Ssklower 					putchar(',');
38545189Ssklower 				any = 1;
38645189Ssklower 				for (; (c = *bits) > 32; bits++)
38745189Ssklower 					putchar(c);
38845189Ssklower 			} else
38945189Ssklower 				for (; *bits > 32; bits++)
39045189Ssklower 					;
39145189Ssklower 		}
39245189Ssklower 		putchar('>');
39345189Ssklower 		putchar('\n');
39445189Ssklower 	}
39545189Ssklower }
396