summaryrefslogtreecommitdiffstats
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
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 0000000..f5fb44a
--- /dev/null
+++ b/recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend
@@ -0,0 +1,16 @@
1FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
2
3SRC_URI += "file://dhclient-exit-hooks \
4 "
5
6do_install_append () {
7 install -m 0644 ${WORKDIR}/dhclient-exit-hooks ${D}${sysconfdir}/dhcp/dhclient-exit-hooks
8 sed 's%/etc/dhclient-exit-hooks%/etc/dhcp/dhclient-exit-hooks%g' -i ${D}${base_sbindir}/dhclient-script
9
10 sed 's%request .*%\noption classless-static-routes code 121 = array of unsigned integer 8;\n\nrequest &%g' -i ${D}${sysconfdir}/dhcp/dhclient.conf
11 sed 's%netbios-name-servers,.*netbios-scope;%netbios-name-servers, netbios-scope, classless-static-routes;\n%g' -i ${D}${sysconfdir}/dhcp/dhclient.conf
12
13}
14
15FILES_dhcp-client += "${sysconfdir}/dhcp/dhclient-exit-hooks \
16 "
diff --git a/recipes-connectivity/dhcp/files/dhclient-exit-hooks b/recipes-connectivity/dhcp/files/dhclient-exit-hooks
new file mode 100644
index 0000000..3be5e02
--- /dev/null
+++ b/recipes-connectivity/dhcp/files/dhclient-exit-hooks
@@ -0,0 +1,92 @@
1#!/bin/bash
2#
3# /etc/dhcp/dhclient-exit-hooks
4#
5# This file is sourced by /sbin/dhclient-script.
6#
7# dhcp option 121 is defined in RFC3442. The following is the link.
8# http://www.ietf.org/rfc/rfc3442.txt
9#
10# The code for this option is 121, and its minimum length is 5 bytes.
11# This option can contain one or more static routes, each of which
12# consists of a destination descriptor and the IP address of the router
13# that should be used to reach that destination.
14#
15# Code Len Destination 1 Router 1
16# +-----+---+----+-----+----+----+----+----+----+
17# | 121 | n | d1 | ... | dN | r1 | r2 | r3 | r4 |
18# +-----+---+----+-----+----+----+----+----+----+
19#
20# Destination 2 Router 2
21# +----+-----+----+----+----+----+----+
22# | d1 | ... | dN | r1 | r2 | r3 | r4 |
23# +----+-----+----+----+----+----+----+
24#
25# In the above example, two static routes are specified.
26#
27# The following table contains some examples of how various subnet
28# number/mask combinations can be encoded:
29#
30# Subnet number Subnet mask Destination descriptor
31# 0 0 0
32# 10.0.0.0 255.0.0.0 8.10
33# 10.0.0.0 255.255.255.0 24.10.0.0
34# 10.17.0.0 255.255.0.0 16.10.17
35# 10.27.129.0 255.255.255.0 24.10.27.129
36# 10.229.0.128 255.255.255.128 25.10.229.0.128
37# 10.198.122.47 255.255.255.255 32.10.198.122.47
38#
39# For metadata service, the following is a valid route from nova-api that
40# the VM instance can uses to retrieve metadata.
41#
42# 32 169 254 169 254 128 224 149 201
43#
44# In the above example, mask length of destination descriptor is always 32,
45# destination is always "169.254.169.254", and the gateway is a valid IP address.
46#
47# The add_routes function takes an array of unsigned integer 8, separated by spaces,
48# parse them, and added each of the routes into routing table.
49#
50
51function add_routes() {
52while [ $# -ne 0 ]; do
53 mask=$1
54 shift
55
56 # Parse the arguments into a CIDR net/mask string
57 if [ $mask -eq 32 ]; then
58 destination="-host $1.$2.$3.$4"
59 shift; shift; shift; shift
60 elif [ $mask -gt 24 ]; then
61 destination="-net $1.$2.$3.$4/$mask"
62 shift; shift; shift; shift
63 elif [ $mask -gt 16 ]; then
64 destination="-net $1.$2.$3.0/$mask"
65 shift; shift; shift
66 elif [ $mask -gt 8 ]; then
67 destination="-net $1.$2.0.0/$mask"
68 shift; shift
69 else
70 destination="-net $1.0.0.0/$mask"
71 shift
72 fi
73
74 # Read the gateway
75 gateway="$1.$2.$3.$4"
76 shift; shift; shift; shift
77
78 # Add route into routing table
79 route add $destination gw $gateway
80
81 # Print it out if the route is added successfully
82 if [ $? = 0 ]; then
83 echo "Added route \"$destination gw $gateway\""
84 fi
85done
86}
87
88# Call add_routes to add routes
89if [ "x$new_classless_static_routes" != x ]; then
90 add_routes $new_classless_static_routes
91fi
92