aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-connectivity
diff options
context:
space:
mode:
authorAndy Ning <andy.ning@windriver.com>2014-06-24 10:33:50 -0400
committerBruce Ashfield <bruce.ashfield@windriver.com>2014-06-24 16:33:32 -0400
commitae839bbb369dd33d6cb53290d0a2ad3d5a72ec49 (patch)
tree31e266e1413da7fd630856a716c2047c877211fd /recipes-connectivity
parent1ee2c197f4d888eee4eb9e3543faf1b4af8915bc (diff)
downloadmeta-cloud-services-ae839bbb369dd33d6cb53290d0a2ad3d5a72ec49.tar.gz
meta-cloud-services-ae839bbb369dd33d6cb53290d0a2ad3d5a72ec49.tar.bz2
meta-cloud-services-ae839bbb369dd33d6cb53290d0a2ad3d5a72ec49.zip
dhcp: add dhcp classless static route support
dhclient needs to be configured to request classess static routes (option code 121) from dhcp server. And dhclient-script will call dhclient-exit-hooks which will parse and add the static routes received from dhcp server into the routing table. The support are built into both controller image and usb guest image, but only guest image makes use of it to add static route for instance to access metadata. Signed-off-by: Andy Ning <andy.ning@windriver.com> Signed-off-by: Bruce Ashfield <bruce.ashfield@windriver.com>
Diffstat (limited to 'recipes-connectivity')
-rw-r--r--recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend16
-rw-r--r--recipes-connectivity/dhcp/files/dhclient-exit-hooks92
2 files changed, 108 insertions, 0 deletions
diff --git a/recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend b/recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend
new file mode 100644
index 00000000..f5fb44ad
--- /dev/null
+++ b/recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend
@@ -0,0 +1,16 @@
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+SRC_URI += "file://dhclient-exit-hooks \
+ "
+
+do_install_append () {
+ install -m 0644 ${WORKDIR}/dhclient-exit-hooks ${D}${sysconfdir}/dhcp/dhclient-exit-hooks
+ sed 's%/etc/dhclient-exit-hooks%/etc/dhcp/dhclient-exit-hooks%g' -i ${D}${base_sbindir}/dhclient-script
+
+ sed 's%request .*%\noption classless-static-routes code 121 = array of unsigned integer 8;\n\nrequest &%g' -i ${D}${sysconfdir}/dhcp/dhclient.conf
+ sed 's%netbios-name-servers,.*netbios-scope;%netbios-name-servers, netbios-scope, classless-static-routes;\n%g' -i ${D}${sysconfdir}/dhcp/dhclient.conf
+
+}
+
+FILES_dhcp-client += "${sysconfdir}/dhcp/dhclient-exit-hooks \
+ "
diff --git a/recipes-connectivity/dhcp/files/dhclient-exit-hooks b/recipes-connectivity/dhcp/files/dhclient-exit-hooks
new file mode 100644
index 00000000..3be5e024
--- /dev/null
+++ b/recipes-connectivity/dhcp/files/dhclient-exit-hooks
@@ -0,0 +1,92 @@
+#!/bin/bash
+#
+# /etc/dhcp/dhclient-exit-hooks
+#
+# This file is sourced by /sbin/dhclient-script.
+#
+# dhcp option 121 is defined in RFC3442. The following is the link.
+# http://www.ietf.org/rfc/rfc3442.txt
+#
+# The code for this option is 121, and its minimum length is 5 bytes.
+# This option can contain one or more static routes, each of which
+# consists of a destination descriptor and the IP address of the router
+# that should be used to reach that destination.
+#
+# Code Len Destination 1 Router 1
+# +-----+---+----+-----+----+----+----+----+----+
+# | 121 | n | d1 | ... | dN | r1 | r2 | r3 | r4 |
+# +-----+---+----+-----+----+----+----+----+----+
+#
+# Destination 2 Router 2
+# +----+-----+----+----+----+----+----+
+# | d1 | ... | dN | r1 | r2 | r3 | r4 |
+# +----+-----+----+----+----+----+----+
+#
+# In the above example, two static routes are specified.
+#
+# The following table contains some examples of how various subnet
+# number/mask combinations can be encoded:
+#
+# Subnet number Subnet mask Destination descriptor
+# 0 0 0
+# 10.0.0.0 255.0.0.0 8.10
+# 10.0.0.0 255.255.255.0 24.10.0.0
+# 10.17.0.0 255.255.0.0 16.10.17
+# 10.27.129.0 255.255.255.0 24.10.27.129
+# 10.229.0.128 255.255.255.128 25.10.229.0.128
+# 10.198.122.47 255.255.255.255 32.10.198.122.47
+#
+# For metadata service, the following is a valid route from nova-api that
+# the VM instance can uses to retrieve metadata.
+#
+# 32 169 254 169 254 128 224 149 201
+#
+# In the above example, mask length of destination descriptor is always 32,
+# destination is always "169.254.169.254", and the gateway is a valid IP address.
+#
+# The add_routes function takes an array of unsigned integer 8, separated by spaces,
+# parse them, and added each of the routes into routing table.
+#
+
+function add_routes() {
+while [ $# -ne 0 ]; do
+ mask=$1
+ shift
+
+ # Parse the arguments into a CIDR net/mask string
+ if [ $mask -eq 32 ]; then
+ destination="-host $1.$2.$3.$4"
+ shift; shift; shift; shift
+ elif [ $mask -gt 24 ]; then
+ destination="-net $1.$2.$3.$4/$mask"
+ shift; shift; shift; shift
+ elif [ $mask -gt 16 ]; then
+ destination="-net $1.$2.$3.0/$mask"
+ shift; shift; shift
+ elif [ $mask -gt 8 ]; then
+ destination="-net $1.$2.0.0/$mask"
+ shift; shift
+ else
+ destination="-net $1.0.0.0/$mask"
+ shift
+ fi
+
+ # Read the gateway
+ gateway="$1.$2.$3.$4"
+ shift; shift; shift; shift
+
+ # Add route into routing table
+ route add $destination gw $gateway
+
+ # Print it out if the route is added successfully
+ if [ $? = 0 ]; then
+ echo "Added route \"$destination gw $gateway\""
+ fi
+done
+}
+
+# Call add_routes to add routes
+if [ "x$new_classless_static_routes" != x ]; then
+ add_routes $new_classless_static_routes
+fi
+