netof.c revision 285612
1206084Srdivacky/*
2206084Srdivacky * netof - return the net address part of an ip address in a sockaddr_storage structure
3206084Srdivacky *         (zero out host part)
4206084Srdivacky */
5206084Srdivacky#include <config.h>
6206084Srdivacky#include <stdio.h>
7206084Srdivacky#include <syslog.h>
8206084Srdivacky
9206084Srdivacky#include "ntp_fp.h"
10206084Srdivacky#include "ntp_net.h"
11206084Srdivacky#include "ntp_stdlib.h"
12206084Srdivacky#include "ntp.h"
13206084Srdivacky
14206084Srdivackysockaddr_u *
15206084Srdivackynetof(
16206084Srdivacky	sockaddr_u *hostaddr
17206084Srdivacky	)
18206084Srdivacky{
19206084Srdivacky	static sockaddr_u	netofbuf[8];
20206084Srdivacky	static int		next_netofbuf;
21206084Srdivacky	u_int32			netnum;
22206084Srdivacky	sockaddr_u *		netaddr;
23204793Srdivacky
24204793Srdivacky	netaddr = &netofbuf[next_netofbuf];
25204793Srdivacky	next_netofbuf = (next_netofbuf + 1) % COUNTOF(netofbuf);
26204793Srdivacky
27204793Srdivacky	memcpy(netaddr, hostaddr, sizeof(*netaddr));
28204793Srdivacky
29204793Srdivacky	if (IS_IPV4(netaddr)) {
30204793Srdivacky		netnum = SRCADR(netaddr);
31204793Srdivacky
32204793Srdivacky		/*
33204793Srdivacky		 * We live in a modern CIDR world where the basement nets, which
34204793Srdivacky		 * used to be class A, are now probably associated with each
35204793Srdivacky		 * host address. So, for class-A nets, all bits are significant.
36204793Srdivacky		 */
37204793Srdivacky		if (IN_CLASSC(netnum))
38204793Srdivacky			netnum &= IN_CLASSC_NET;
39204793Srdivacky		else if (IN_CLASSB(netnum))
40204793Srdivacky			netnum &= IN_CLASSB_NET;
41204793Srdivacky
42204793Srdivacky		SET_ADDR4(netaddr, netnum);
43204793Srdivacky
44204793Srdivacky	} else if (IS_IPV6(netaddr))
45204793Srdivacky		/* assume the typical /64 subnet size */
46204793Srdivacky		zero_mem(&NSRCADR6(netaddr)[8], 8);
47204793Srdivacky#ifdef DEBUG
48204962Srdivacky	else {
49204793Srdivacky		msyslog(LOG_ERR, "netof unknown AF %d", AF(netaddr));
50204793Srdivacky		exit(1);
51204793Srdivacky	}
52204793Srdivacky#endif
53204793Srdivacky
54204793Srdivacky	return netaddr;
55204793Srdivacky}
56204793Srdivacky