projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
private flags collided with multicast and link flags
[unix-history]
/
usr
/
src
/
sbin
/
routed
/
af.c
diff --git
a/usr/src/sbin/routed/af.c
b/usr/src/sbin/routed/af.c
index
3bcddfb
..
6816bc1
100644
(file)
--- a/
usr/src/sbin/routed/af.c
+++ b/
usr/src/sbin/routed/af.c
@@
-1,60
+1,76
@@
-#ifndef lint
-static char sccsid[] = "@(#)af.c 4.2 %G%";
-#endif
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
-#i
nclude <sys/types.h>
-#include <sys/socket.h>
-#
include <net/in.h>
+#i
fndef lint
+static char sccsid[] = "@(#)af.c 5.11 (Berkeley) %G%";
+#
endif /* not lint */
-#include "router.h"
-#include "rip.h"
+#include "defs.h"
/*
* Address family support routines
*/
/*
* Address family support routines
*/
-int null_hash(), null_netmatch(), null_output(),
- null_portmatch(), null_portcheck(),
- null_checkhost(), null_canon();
int inet_hash(), inet_netmatch(), inet_output(),
inet_portmatch(), inet_portcheck(),
int inet_hash(), inet_netmatch(), inet_output(),
inet_portmatch(), inet_portcheck(),
- inet_checkhost(), inet_canon();
-#define NIL \
- { null_hash, null_netmatch, null_output, \
- null_portmatch, null_portcheck, null_checkhost, \
- null_canon }
+ inet_checkhost(), inet_rtflags(), inet_sendroute(), inet_canon();
+char *inet_format();
+
+#define NIL { 0 }
#define INET \
{ inet_hash, inet_netmatch, inet_output, \
inet_portmatch, inet_portcheck, inet_checkhost, \
#define INET \
{ inet_hash, inet_netmatch, inet_output, \
inet_portmatch, inet_portcheck, inet_checkhost, \
- inet_canon }
+ inet_rtflags, inet_sendroute, inet_canon, \
+ inet_format \
+ }
+
+struct afswitch afswitch[AF_MAX] = {
+ NIL, /* 0- unused */
+ NIL, /* 1- Unix domain, unused */
+ INET, /* Internet */
+};
-struct afswitch afswitch[AF_MAX] =
- { NIL, NIL, INET, INET, NIL, NIL, NIL, NIL, NIL, NIL, NIL };
+int af_max = sizeof(afswitch) / sizeof(afswitch[0]);
+
+struct sockaddr_in inet_default = {
+#ifdef RTM_ADD
+ sizeof (inet_default),
+#endif
+ AF_INET, INADDR_ANY };
inet_hash(sin, hp)
register struct sockaddr_in *sin;
struct afhash *hp;
{
inet_hash(sin, hp)
register struct sockaddr_in *sin;
struct afhash *hp;
{
+ register u_long n;
- hp->afh_nethash = sin->sin_addr.s_net;
+ n = inet_netof(sin->sin_addr);
+ if (n)
+ while ((n & 0xff) == 0)
+ n >>= 8;
+ hp->afh_nethash = n;
hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
hp->afh_hosthash = ntohl(sin->sin_addr.s_addr);
+ hp->afh_hosthash &= 0x7fffffff;
}
inet_netmatch(sin1, sin2)
struct sockaddr_in *sin1, *sin2;
{
}
inet_netmatch(sin1, sin2)
struct sockaddr_in *sin1, *sin2;
{
- return (
sin1->sin_addr.s_net == sin2->sin_addr.s_net
);
+ return (
inet_netof(sin1->sin_addr) == inet_netof(sin2->sin_addr)
);
}
/*
* Verify the message is from the right port.
*/
inet_portmatch(sin)
}
/*
* Verify the message is from the right port.
*/
inet_portmatch(sin)
- struct sockaddr_in *sin;
+
register
struct sockaddr_in *sin;
{
{
- int port = ntohs(sin->sin_port);
-
- return (port == IPPORT_ROUTESERVER);
+
+ return (sin->sin_port == sp->s_port);
}
/*
}
/*
@@
-63,99
+79,67
@@
inet_portmatch(sin)
inet_portcheck(sin)
struct sockaddr_in *sin;
{
inet_portcheck(sin)
struct sockaddr_in *sin;
{
- int port = ntohs(sin->sin_port);
- return (
port
<= IPPORT_RESERVED);
+ return (
ntohs(sin->sin_port)
<= IPPORT_RESERVED);
}
/*
* Internet output routine.
*/
}
/*
* Internet output routine.
*/
-inet_output(sin, size)
+inet_output(s, flags, sin, size)
+ int s, flags;
struct sockaddr_in *sin;
int size;
{
struct sockaddr_in *sin;
int size;
{
- extern int s;
- extern char packet[MAXPACKETSIZE];
struct sockaddr_in dst;
dst = *sin;
sin = &dst;
if (sin->sin_port == 0)
struct sockaddr_in dst;
dst = *sin;
sin = &dst;
if (sin->sin_port == 0)
- sin->sin_port = htons(IPPORT_ROUTESERVER);
- if (send(s, sin, packet, size) < 0)
- perror("send");
+ sin->sin_port = sp->s_port;
+ if (sin->sin_len == 0)
+ sin->sin_len = sizeof (*sin);
+ if (sendto(s, packet, size, flags,
+ (struct sockaddr *)sin, sizeof (*sin)) < 0)
+ perror("sendto");
}
/*
}
/*
- * Return 1 if the address is
for an Internet host,
- *
otherwise assume it's a network address (broadcast)
.
+ * Return 1 if the address is
believed
+ *
for an Internet host -- THIS IS A KLUDGE
.
*/
inet_checkhost(sin)
struct sockaddr_in *sin;
{
*/
inet_checkhost(sin)
struct sockaddr_in *sin;
{
- extern struct in_addr if_makeaddr();
- struct in_addr netaddr;
+ u_long i = ntohl(sin->sin_addr.s_addr);
+
+#ifndef IN_EXPERIMENTAL
+#define IN_EXPERIMENTAL(i) (((long) (i) & 0xe0000000) == 0xe0000000)
+#endif
- netaddr = if_makeaddr((int)sin->sin_addr.s_net, INADDR_ANY);
- return (netaddr.s_addr != sin->sin_addr.s_addr);
+ if (IN_EXPERIMENTAL(i) || sin->sin_port != 0)
+ return (0);
+ if (i != 0 && (i & 0xff000000) == 0)
+ return (0);
+ for (i = 0; i < sizeof(sin->sin_zero)/sizeof(sin->sin_zero[0]); i++)
+ if (sin->sin_zero[i])
+ return (0);
+ return (1);
}
inet_canon(sin)
struct sockaddr_in *sin;
{
}
inet_canon(sin)
struct sockaddr_in *sin;
{
- sin->sin_port = 0;
-}
-
-/*ARGSUSED*/
-null_hash(addr, hp)
- struct sockaddr *addr;
- struct afhash *hp;
-{
-
- hp->afh_nethash = hp->afh_hosthash = 0;
-}
-
-/*ARGSUSED*/
-null_netmatch(a1, a2)
- struct sockaddr *a1, *a2;
-{
-
- return (0);
-}
-
-/*ARGSUSED*/
-null_output(a1, n)
- struct sockaddr *a1;
- int n;
-{
- ;
-}
-/*ARGSUSED*/
-null_portmatch(a1)
- struct sockaddr *a1;
-{
- return (0);
-}
-
-/*ARGSUSED*/
-null_portcheck(a1)
- struct sockaddr *a1;
-{
- return (0);
+ sin->sin_port = 0;
+ sin->sin_len = sizeof(*sin);
}
}
-/*ARGSUSED*/
-
null_checkhost(a1
)
- struct sockaddr
*a1
;
+char *
+
inet_format(sin
)
+ struct sockaddr
_in *sin
;
{
{
- return (0);
-}
+ char *inet_ntoa();
-/*ARGSUSED*/
-null_canon(a1)
- struct sockaddr *a1;
-{
- ;
+ return (inet_ntoa(sin->sin_addr));
}
}