1if [ ! "$_MEDIA_NETWORK_SUBR" ]; then _MEDIA_NETWORK_SUBR=1
2#
3# Copyright (c) 2012-2013 Devin Teske
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD$
28#
29############################################################ INCLUDES
30
31BSDCFG_SHARE="/usr/share/bsdconfig"
32. $BSDCFG_SHARE/common.subr || exit 1
33f_dprintf "%s: loading includes..." media/network.subr
34f_include $BSDCFG_SHARE/dialog.subr
35f_include $BSDCFG_SHARE/media/tcpip.subr
36
37BSDCFG_LIBE="/usr/libexec/bsdconfig"
38f_include_lang $BSDCFG_LIBE/include/messages.subr
39
40############################################################ GLOBALS
41
42NETWORK_INITIALIZED=
43
44############################################################ FUNCTIONS
45
46# f_media_init_network $device
47#
48# Initialize a network device (such as `fxp0', `em0', etc.). Returns success if
49# able to successfully initialize the device. If not running as init (basically
50# from the FreeBSD install media) then assume that the network has already been
51# initialized and returns success.
52#
53# The variables (from variable.subr) used to initialize the network are as
54# follows (all of which are configured either automatically or manaully):
55#
56# 	VAR_IFCONFIG + device_name (e.g., `ifconfig_em0')
57# 		Automatically populated but can be overridden in a script. This
58# 		defines the ifconfig(8) properties specific to a chosen network
59# 		interface device. Optional if VAR_IPV6ADDR is set.
60# 	VAR_IPV6ADDR [Optional]
61# 		If not running as init (and setting up RTSOL connections for
62# 		the interface), then must be set manually. If set, used as the
63# 		IPv6 configuration for the given network interface device.
64# 	VAR_GATEWAY [Optional]
65# 		If not running as init (and setting up a static connection for
66# 		the interface) then must be set (usually via rc.conf(5), but
67# 		can be set manually to override). If unset, the user is warned
68# 		but not prevented from proceeding (as most connections need a
69# 		default route but not everyone).
70#
71f_media_init_network()
72{
73	local dev="$1"
74
75	f_dprintf "Init routine called for network device \`%s'." "$dev"
76	if [ "$NETWORK_INITIALIZED" ]; then
77		f_dprintf "Network already initialized."
78		return $SUCCESS
79	elif ! f_running_as_init; then
80		f_dprintf "Not running as init -- calling the deed done."
81		NETWORK_INITIALIZED=1
82		return $SUCCESS
83	fi
84
85	if [ ! -e "$RESOLV_CONF" ]; then
86		if ! f_config_resolv; then
87			f_show_msg "$msg_cant_seem_to_write_out_resolv_conf" \
88			           "$RESOLV_CONF"
89			return $FAILURE
90		fi
91	fi
92
93	local cp
94	if f_getvar $VAR_IFCONFIG$dev cp; then
95		#
96		# If this interface isn't a DHCP one, bring it up.
97		# If it is, then it's already up.
98		#
99		case "$cp" in
100		*DHCP*)
101			f_dprintf "A DHCP interface.  Should already be up."
102			;;
103		*)
104			f_dprintf "Not a DHCP interface."
105			if ! f_quietly ifconfig "$dev" $cp; then
106				f_show_msg "$msg_unable_to_configure_device" \
107				           "$dev"
108				return $FAILURE
109			fi
110			local rp
111			f_getvar $VAR_GATEWAY rp
112			if [ ! "$rp" ]; then
113				f_show_msg "$msg_no_gateway_has_been_set"
114			else
115				#
116				# Explicitly flush all routes to get back to a
117				# known sane state. We don't need to check this
118				# exit code because if anything fails it will
119				# show up in the route add below.
120				#
121				f_quietly route -n flush
122				f_dprintf "Adding default route to %s." "$rp"
123				if ! f_quietly route -n add default "$rp"; then
124					f_show_msg \
125					    "$msg_failed_to_add_default_route"
126					return $FAILURE
127				fi
128			fi
129		esac
130	elif ! { f_getvar $VAR_IPV6ADDR cp && [ "$cp" ]; }; then
131		f_show_msg "$msg_device_is_not_configured" "$dev"
132		return $FAILURE
133	fi
134
135	f_dprintf "Network initialized successfully."
136	NETWORK_INITIALIZED=1
137	return $SUCCESS
138}
139
140# f_media_shutdown_network $device
141#
142# Shuts down the configured network device (e.g., `fxp0', `em0', etc.) and
143# deletes the default route (if configured). Returns failure if the device
144# passed has not been configured. If not running as init (basically from the
145# FreeBSD install media) then does nothing and returns success.
146#
147f_media_shutdown_network()
148{
149	local dev="$1" cp
150
151	f_dprintf "Shutdown called for network device %s" "$dev"
152	if [ ! "$NETWORK_INITIALIZED" ]; then
153		f_dprintf "Network not initialized -- nothing to do."
154		return $SUCCESS
155	fi
156
157	unset NETWORK_INITIALIZED
158	unset $VAR_NETWORK_DEVICE
159
160	if ! f_running_as_init; then
161		f_dprintf "Not running as init -- calling the deed done."
162		return $SUCCESS
163	fi
164
165	f_getvar $VAR_IFCONFIG$dev cp || return $FAILURE
166	f_dprintf "ifconfig %s down" "$dev"
167	f_quietly ifconfig $dev down ||
168		f_show_msg "$msg_unable_to_down_the_interface_properly" "$dev"
169
170	if f_getvar $VAR_GATEWAY cp; then
171		f_dprintf "Deleting default route."
172		f_quietly route -n delete default
173	fi
174
175	return $SUCCESS
176}
177
178############################################################ MAIN
179
180f_dprintf "%s: Successfully loaded." media/network.subr
181
182fi # ! $_MEDIA_NETWORK_SUBR
183