summaryrefslogtreecommitdiff
path: root/libntp/netof.c
diff options
context:
space:
mode:
authorOllivier Robert <roberto@FreeBSD.org>2008-08-17 17:37:33 +0000
committerOllivier Robert <roberto@FreeBSD.org>2008-08-17 17:37:33 +0000
commitcce65f439697627afbccf5a67035a957bb4d784a (patch)
tree16d100fbc9dae63888d48b464e471ba0e5065193 /libntp/netof.c
parent8c24a1e0ffd629427f94da1b681600008030c41a (diff)
Notes
Diffstat (limited to 'libntp/netof.c')
-rw-r--r--libntp/netof.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/libntp/netof.c b/libntp/netof.c
new file mode 100644
index 000000000000..fd57568d3130
--- /dev/null
+++ b/libntp/netof.c
@@ -0,0 +1,48 @@
+/*
+ * netof - return the net address part of an ip address in a sockaddr_storage structure
+ * (zero out host part)
+ */
+#include <stdio.h>
+
+#include "ntp_fp.h"
+#include "ntp_stdlib.h"
+#include "ntp.h"
+
+#define NUM_NETOF_BUFS 10
+static struct sockaddr_storage ssbuf[NUM_NETOF_BUFS];
+static int next_ssbuf = 0;
+
+struct sockaddr_storage*
+netof(
+ struct sockaddr_storage* hostaddr
+ )
+{
+ register u_int32 netnum;
+ struct sockaddr_storage *netaddr;
+
+ netaddr = &ssbuf[next_ssbuf++];
+ if (next_ssbuf == NUM_NETOF_BUFS)
+ next_ssbuf = 0;
+ memcpy(netaddr, hostaddr, sizeof(struct sockaddr_storage));
+
+ if(netaddr->ss_family == AF_INET) {
+ netnum = ((struct sockaddr_in*)netaddr)->sin_addr.s_addr;
+
+ /*
+ * We live in a modern CIDR world where the basement nets, which
+ * used to be class A, are now probably associated with each
+ * host address. So, for class-A nets, all bits are significant.
+ */
+ if(IN_CLASSC(netnum))
+ netnum &= IN_CLASSC_NET;
+ else if (IN_CLASSB(netnum))
+ netnum &= IN_CLASSB_NET;
+ ((struct sockaddr_in*)netaddr)->sin_addr.s_addr = netnum;
+ }
+ else if(netaddr->ss_family == AF_INET6) {
+ /* Here we put 0 at the local link address so we get net address */
+ memset(&((struct sockaddr_in6*)netaddr)->sin6_addr.s6_addr[8], 0, 8*sizeof(u_char));
+ }
+
+ return netaddr;
+}