[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
DHCP support
From: |
Marco Gerards |
Subject: |
DHCP support |
Date: |
Tue, 04 Jan 2005 14:23:43 +0000 |
User-agent: |
Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux) |
Hi,
Here is a patch to make pfinet use 0.0.0.0 as IP address and make
broadcasting possible when pfinet is started with `--dhcp'. Perhaps
it would be nice to include this in the Hurd, or just in Debian if it
is too much of a hack. I don't want to put too much time in it if it
is completely wrong. In that case, just use it when you don't care
about such things.
Alfred promised me to make the dhcp client itself work. I have some
hacked stuff around to start with, the only thing that really needs to
be done is hacking the script to change the ip address, etc, when the
DHCP server replied.
Thanks,
Marco
2005-01-04 Marco Gerards <metgerards@student.han.nl>
* options.c (options): Add the option `dhcp'.
(parse_opt): In case pfinet is started the argument `--dhcp', set
the address to `0.0.0.0', the netmask to `255.0.0.0' and add the
route for `0.0.0.0' so broadcasting works.
* linux-src/net/ipv4/devinet.c (inet_insert_ifa) [_HURD_]: Don't
fail when the address is `0.0.0.0'.
Index: options.c
===================================================================
RCS file: /cvsroot/hurd/hurd/pfinet/options.c,v
retrieving revision 1.11
diff -u -p -r1.11 options.c
--- options.c 18 Jul 2001 16:56:57 -0000 1.11
+++ options.c 4 Jan 2005 14:18:09 -0000
@@ -1,6 +1,6 @@
/* Pfinet option parsing
- Copyright (C) 1996,97,2000,01 Free Software Foundation, Inc.
+ Copyright (C) 1996,97,2000,01,2005 Free Software Foundation, Inc.
Written by Miles Bader <miles@gnu.org>
@@ -60,6 +60,7 @@ static const struct argp_option options[
{"netmask", 'm', "MASK", 0, "Set the netmask"},
{"peer", 'p', "ADDRESS", 0, "Set the peer address"},
{"gateway", 'g', "ADDRESS", 0, "Set the default gateway"},
+ {"dhcp", 'd', 0 , 0, "Prepare pfinet for dhcp"},
{"shutdown", 's', 0, 0, "Shut it down"},
{0}
};
@@ -111,6 +112,8 @@ parse_hook_add_interface (struct parse_h
return 0;
}
+static int dhcp_option;
+
static error_t
parse_opt (int opt, char *arg, struct argp_state *state)
{
@@ -189,6 +192,8 @@ parse_opt (int opt, char *arg, struct ar
"%s: Illegal or undefined network address", arg);
}
break;
+ case 'd':
+ dhcp_option = 1; break;
case 'm':
h->curint->netmask = ADDR (arg, "netmask"); break;
case 'p':
@@ -213,6 +218,16 @@ parse_opt (int opt, char *arg, struct ar
case ARGP_KEY_SUCCESS:
in = h->curint;
+
+ /* Configure the interface to default values. */
+ if (dhcp_option)
+ {
+ h->curint->netmask = ADDR ("255.0.0.0", "netmask");
+ h->curint->address = ADDR ("0.0.0.0", "address");
+ h->curint->gateway = INADDR_NONE;
+ h->curint->peer = INADDR_NONE;
+ }
+
if (! in->device)
/* No specific interface specified; is that ok? */
if (in->address != INADDR_NONE || in->netmask != INADDR_NONE
@@ -315,6 +330,53 @@ parse_opt (int opt, char *arg, struct ar
}
}
+ /* Setup the routing required for DHCP. */
+ if (dhcp_option)
+ {
+ struct kern_rta rta;
+ struct
+ {
+ struct nlmsghdr nlh;
+ struct rtmsg rtm;
+ } req;
+ struct fib_table *tb;
+ struct rtentry route;
+ struct sockaddr_in *dst;
+ struct device *dev;
+
+ dst = (struct sockaddr_in *) &route.rt_dst;
+ dev = dev_get ("eth0");
+ if (!dev)
+ {
+ __mutex_unlock (&global_lock);
+ FAIL (ENODEV, 17, 0, "unknown device");
+ }
+
+ /* Simulate the SIOCADDRT behavior. */
+ bzero (&route, sizeof (struct rtentry));
+ bzero (&req.rtm, sizeof req.rtm);
+ bzero (&rta, sizeof rta);
+ req.nlh.nlmsg_type = RTM_NEWROUTE;
+ req.nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE;
+ req.rtm.rtm_protocol = RTPROT_BOOT;
+ req.rtm.rtm_scope = RT_SCOPE_LINK;
+ req.rtm.rtm_type = RTN_UNICAST;
+ rta.rta_dst = &dst->sin_addr.s_addr;
+ rta.rta_oif = &dev->ifindex;
+
+ tb = fib_new_table (req.rtm.rtm_table);
+ if (tb)
+ err = tb->tb_insert (tb, &req.rtm, &rta, &req.nlh, NULL);
+ else
+ err = ENOBUFS;
+
+ if (err)
+ {
+ __mutex_unlock (&global_lock);
+ FAIL (err, 17, 0, "cannot add route");
+ }
+ }
+
__mutex_unlock (&global_lock);
/* Fall through to free hook. */
Index: linux-src/net/ipv4/devinet.c
===================================================================
RCS file: /cvsroot/hurd/hurd/pfinet/linux-src/net/ipv4/devinet.c,v
retrieving revision 1.8
diff -u -p -r1.8 devinet.c
--- linux-src/net/ipv4/devinet.c 18 Jul 2001 17:37:13 -0000 1.8
+++ linux-src/net/ipv4/devinet.c 4 Jan 2005 14:18:11 -0000
@@ -214,10 +214,12 @@ inet_insert_ifa(struct in_device *in_dev
{
struct in_ifaddr *ifa1, **ifap, **last_primary;
+#ifndef _HURD_
if (ifa->ifa_local == 0) {
inet_free_ifa(ifa);
return 0;
}
+#endif
ifa->ifa_flags &= ~IFA_F_SECONDARY;
last_primary = &in_dev->ifa_list;
- DHCP support,
Marco Gerards <=
- Re: DHCP support, Alfred M. Szmidt, 2005/01/04
- Re: DHCP support, Neal H. Walfield, 2005/01/04
- Re: DHCP support, Marco Gerards, 2005/01/06
- Re: DHCP support, Alfred M. Szmidt, 2005/01/06
- Re: DHCP support, Neal H. Walfield, 2005/01/06
- Re: DHCP support, Roland McGrath, 2005/01/06
- Re: DHCP support, Marco Gerards, 2005/01/06
- Re: DHCP support, Alfred M. Szmidt, 2005/01/06
- Re: DHCP support, Roland McGrath, 2005/01/06
- Re: DHCP support, Marco Gerards, 2005/01/06