|
|
@@ -12,6 +12,8 @@
|
|
12
|
12
|
#include <gpxe/netdevice.h>
|
|
13
|
13
|
#include <gpxe/ip.h>
|
|
14
|
14
|
#include <gpxe/tcpip.h>
|
|
|
15
|
+#include <gpxe/dhcp.h>
|
|
|
16
|
+#include <gpxe/settings.h>
|
|
15
|
17
|
|
|
16
|
18
|
/** @file
|
|
17
|
19
|
*
|
|
|
@@ -94,45 +96,47 @@ static void del_ipv4_miniroute ( struct ipv4_miniroute *miniroute ) {
|
|
94
|
96
|
}
|
|
95
|
97
|
|
|
96
|
98
|
/**
|
|
97
|
|
- * Add IPv4 interface
|
|
98
|
|
- *
|
|
99
|
|
- * @v netdev Network device
|
|
100
|
|
- * @v address IPv4 address
|
|
101
|
|
- * @v netmask Subnet mask
|
|
102
|
|
- * @v gateway Gateway address (or @c INADDR_NONE for no gateway)
|
|
103
|
|
- * @ret rc Return status code
|
|
|
99
|
+ * Create IPv4 routing table
|
|
104
|
100
|
*
|
|
|
101
|
+ * @ret rc Return status code
|
|
105
|
102
|
*/
|
|
106
|
|
-int add_ipv4_address ( struct net_device *netdev, struct in_addr address,
|
|
107
|
|
- struct in_addr netmask, struct in_addr gateway ) {
|
|
|
103
|
+static int ipv4_create_routes ( void ) {
|
|
108
|
104
|
struct ipv4_miniroute *miniroute;
|
|
109
|
|
-
|
|
110
|
|
- /* Clear any existing address for this net device */
|
|
111
|
|
- del_ipv4_address ( netdev );
|
|
112
|
|
-
|
|
113
|
|
- /* Add new miniroute */
|
|
114
|
|
- miniroute = add_ipv4_miniroute ( netdev, address, netmask, gateway );
|
|
115
|
|
- if ( ! miniroute )
|
|
116
|
|
- return -ENOMEM;
|
|
|
105
|
+ struct ipv4_miniroute *tmp;
|
|
|
106
|
+ struct net_device *netdev;
|
|
|
107
|
+ struct settings *settings;
|
|
|
108
|
+ struct in_addr address = { 0 };
|
|
|
109
|
+ struct in_addr netmask = { 0 };
|
|
|
110
|
+ struct in_addr gateway = { INADDR_NONE };
|
|
|
111
|
+
|
|
|
112
|
+ /* Delete all existing routes */
|
|
|
113
|
+ list_for_each_entry_safe ( miniroute, tmp, &ipv4_miniroutes, list )
|
|
|
114
|
+ del_ipv4_miniroute ( miniroute );
|
|
|
115
|
+
|
|
|
116
|
+ /* Create a route for each configured network device */
|
|
|
117
|
+ for_each_netdev ( netdev ) {
|
|
|
118
|
+ settings = netdev_settings ( netdev );
|
|
|
119
|
+ address.s_addr = 0;
|
|
|
120
|
+ fetch_ipv4_setting ( settings, DHCP_EB_YIADDR, &address );
|
|
|
121
|
+ netmask.s_addr = 0;
|
|
|
122
|
+ fetch_ipv4_setting ( settings, DHCP_SUBNET_MASK, &netmask );
|
|
|
123
|
+ gateway.s_addr = INADDR_NONE;
|
|
|
124
|
+ fetch_ipv4_setting ( settings, DHCP_ROUTERS, &gateway );
|
|
|
125
|
+ if ( address.s_addr ) {
|
|
|
126
|
+ miniroute = add_ipv4_miniroute ( netdev, address,
|
|
|
127
|
+ netmask, gateway );
|
|
|
128
|
+ if ( ! miniroute )
|
|
|
129
|
+ return -ENOMEM;
|
|
|
130
|
+ }
|
|
|
131
|
+ }
|
|
117
|
132
|
|
|
118
|
133
|
return 0;
|
|
119
|
134
|
}
|
|
120
|
135
|
|
|
121
|
|
-/**
|
|
122
|
|
- * Remove IPv4 interface
|
|
123
|
|
- *
|
|
124
|
|
- * @v netdev Network device
|
|
125
|
|
- */
|
|
126
|
|
-void del_ipv4_address ( struct net_device *netdev ) {
|
|
127
|
|
- struct ipv4_miniroute *miniroute;
|
|
128
|
|
-
|
|
129
|
|
- list_for_each_entry ( miniroute, &ipv4_miniroutes, list ) {
|
|
130
|
|
- if ( miniroute->netdev == netdev ) {
|
|
131
|
|
- del_ipv4_miniroute ( miniroute );
|
|
132
|
|
- break;
|
|
133
|
|
- }
|
|
134
|
|
- }
|
|
135
|
|
-}
|
|
|
136
|
+/** IPv4 settings applicator */
|
|
|
137
|
+struct settings_applicator ipv4_settings_applicator __settings_applicator = {
|
|
|
138
|
+ .apply = ipv4_create_routes,
|
|
|
139
|
+};
|
|
136
|
140
|
|
|
137
|
141
|
/**
|
|
138
|
142
|
* Perform IPv4 routing
|