1/*	$NetBSD: mask_addr.c,v 1.2 2017/02/14 01:16:49 christos Exp $	*/
2
3/*++
4/* NAME
5/*	mask_addr 3
6/* SUMMARY
7/*	address bit banging
8/* SYNOPSIS
9/*	#include <mask_addr.h>
10/*
11/*	void	mask_addr(addr_bytes, addr_byte_count, network_bits)
12/*	unsigned char *addr_bytes;
13/*	unsigned addr_byte_count;
14/*	unsigned network_bits;
15/* DESCRIPTION
16/*	mask_addr() clears all the host bits in the specified
17/*	address.  The code can handle addresses of any length,
18/*	and bytes of any width.
19/*
20/*	Arguments:
21/* .IP addr_bytes
22/*	The network address in network byte order.
23/* .IP addr_byte_count
24/*	The network address length in bytes.
25/* .IP network_bits
26/*	The number of initial bits that will not be cleared.
27/* DIAGNOSTICS
28/*	Fatal errors: the number of network bits exceeds the address size.
29/* LICENSE
30/* .ad
31/* .fi
32/*	The Secure Mailer license must be distributed with this software.
33/* AUTHOR(S)
34/*	Wietse Venema
35/*	IBM T.J. Watson Research
36/*	P.O. Box 704
37/*	Yorktown Heights, NY 10598, USA
38/*--*/
39
40/* System library. */
41
42#include <sys_defs.h>
43#include <limits.h>			/* CHAR_BIT */
44
45/* Utility library. */
46
47#include <msg.h>
48#include <mask_addr.h>
49
50/* mask_addr - mask off a variable-length address */
51
52void    mask_addr(unsigned char *addr_bytes,
53		          unsigned addr_byte_count,
54		          unsigned network_bits)
55{
56    unsigned char *p;
57
58    if (network_bits > addr_byte_count * CHAR_BIT)
59	msg_panic("mask_addr: address byte count %d too small for bit count %d",
60		  addr_byte_count, network_bits);
61
62    p = addr_bytes + network_bits / CHAR_BIT;
63    network_bits %= CHAR_BIT;
64
65    if (network_bits != 0)
66	*p++ &= ~0U << (CHAR_BIT - network_bits);
67
68    while (p < addr_bytes + addr_byte_count)
69	*p++ = 0;
70}
71