1e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt/*
2e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * dhcpcd - DHCP client daemon
3a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt * Copyright (c) 2006-2012 Roy Marples <roy@marples.name>
4e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * All rights reserved
5e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
6e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * Redistribution and use in source and binary forms, with or without
7e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * modification, are permitted provided that the following conditions
8e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * are met:
9e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * 1. Redistributions of source code must retain the above copyright
10e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt *    notice, this list of conditions and the following disclaimer.
11e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * 2. Redistributions in binary form must reproduce the above copyright
12e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt *    notice, this list of conditions and the following disclaimer in the
13e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt *    documentation and/or other materials provided with the distribution.
14e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt *
15e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt * SUCH DAMAGE.
26e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt */
27e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
28e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <sys/param.h>
29a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt#include <sys/socket.h>
30e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <sys/sysctl.h>
31e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include <sys/utsname.h>
32a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt#include <netinet/in.h>
33a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
34a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt#include <syslog.h>
35e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
36e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#include "platform.h"
37e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
38e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#ifndef SYS_NMLN	/* OSX */
39e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#  define SYS_NMLN 256
40e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt#endif
41e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
42e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtstatic char march[SYS_NMLN];
43e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
44e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidtchar *
45e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidthardware_platform(void)
46e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt{
47e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	int mib[2] = { CTL_HW, HW_MACHINE_ARCH };
48e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	size_t len = sizeof(march);
49e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt
50e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	if (sysctl(mib, sizeof(mib) / sizeof(mib[0]),
51e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt		march, &len, NULL, 0) != 0)
52e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt		return NULL;
53e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt	return march;
54e86eee143ed21592f88a46623a81f71002430459Dmitry Shmidt}
55a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
56a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtstatic int
57a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtinet6_sysctl(int code)
58a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt{
59a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	int mib[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 };
60a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	int val;
61a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	size_t size;
62a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
63a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	mib[3] = code;
64a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	size = sizeof(val);
65a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	if (sysctl(mib, sizeof(mib)/sizeof(mib[0]), &val, &size, NULL, 0) == -1)
66a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		return -1;
67a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	return val;
68a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt}
69a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
70a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtint
71a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidtcheck_ipv6(const char *ifname)
72a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt{
73a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
74a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	/* BSD doesn't support these values per iface, so just reutrn 1 */
75a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	if (ifname)
76a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		return 1;
77a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt
78a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	if (inet6_sysctl(IPV6CTL_ACCEPT_RTADV) != 1) {
79a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		syslog(LOG_WARNING,
80a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		    "Kernel is not configured to accept IPv6 RAs");
81a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		return 0;
82a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	}
83a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	if (inet6_sysctl(IPV6CTL_FORWARDING) != 0) {
84a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		syslog(LOG_WARNING,
85a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		    "Kernel is configured as a router, not a host");
86a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt		return 0;
87a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	}
88a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt	return 1;
89a3a2260384a906e1674c7498c2f479e9f37bc503Dmitry Shmidt}
90