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