diff options
author | Andy Ning <andy.ning@windriver.com> | 2014-06-24 10:33:50 -0400 |
---|---|---|
committer | Bruce Ashfield <bruce.ashfield@windriver.com> | 2014-06-24 16:33:32 -0400 |
commit | ae839bbb369dd33d6cb53290d0a2ad3d5a72ec49 (patch) | |
tree | 31e266e1413da7fd630856a716c2047c877211fd /recipes-connectivity/dhcp | |
parent | 1ee2c197f4d888eee4eb9e3543faf1b4af8915bc (diff) | |
download | meta-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/dhcp')
-rw-r--r-- | recipes-connectivity/dhcp/dhcp_4.2.3-P2.bbappend | 16 | ||||
-rw-r--r-- | recipes-connectivity/dhcp/files/dhclient-exit-hooks | 92 |
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 @@ | |||
1 | FILESEXTRAPATHS_prepend := "${THISDIR}/files:" | ||
2 | |||
3 | SRC_URI += "file://dhclient-exit-hooks \ | ||
4 | " | ||
5 | |||
6 | do_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 | |||
15 | FILES_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 | |||
51 | function add_routes() { | ||
52 | while [ $# -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 | ||
85 | done | ||
86 | } | ||
87 | |||
88 | # Call add_routes to add routes | ||
89 | if [ "x$new_classless_static_routes" != x ]; then | ||
90 | add_routes $new_classless_static_routes | ||
91 | fi | ||
92 | |||