mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-29 13:28:14 +00:00
Moved to relay/
This commit is contained in:
parent
034aa896ce
commit
6e5382c00d
123
dhcrelay.8
123
dhcrelay.8
@ -1,123 +0,0 @@
|
||||
.\" dhcrelay.8
|
||||
.\"
|
||||
.\" Copyright (c) 1997 The Internet Software Consortium.
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\"
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. Neither the name of The Internet Software Consortium nor the names
|
||||
.\" of its contributors may be used to endorse or promote products derived
|
||||
.\" from this software without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
|
||||
.\" CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
.\" DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
|
||||
.\" CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
.\" USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
.\" ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
.\" OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" This software has been written for the Internet Software Consortium
|
||||
.\" by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
|
||||
.\" Enterprises. To learn more about the Internet Software Consortium,
|
||||
.\" see ``http://www.isc.org/isc''. To learn more about Vixie
|
||||
.\" Enterprises, see ``http://www.vix.com''.
|
||||
.TH dhcrelay 8
|
||||
.SH NAME
|
||||
dhcpd - Dynamic Host Configuration Protocol Relay Agent
|
||||
.SH SYNOPSIS
|
||||
.B dhcrelay
|
||||
[
|
||||
.B -p
|
||||
.I port
|
||||
]
|
||||
[
|
||||
.B -d
|
||||
]
|
||||
[
|
||||
.B -i
|
||||
.I if0
|
||||
[
|
||||
.B ...
|
||||
.B -i
|
||||
.I ifN
|
||||
]
|
||||
]
|
||||
.I server0
|
||||
[
|
||||
.I ...serverN
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
The Internet Software Consortium DHCP Relay Agent, dhcrelay, provides a
|
||||
means for relaying DHCP and BOOTP requests from a subnet to which
|
||||
no DHCP server is directly to one or more DHCP servers on other
|
||||
subnets.
|
||||
.SH OPERATION
|
||||
.PP
|
||||
The DHCP Relay Agent listens for DHCP requests on all interfaces
|
||||
attached to a host, or only on those interfaces specified on the
|
||||
command line with the
|
||||
.I -i
|
||||
flag. When a query is received, it forwards it to the list of DHCP
|
||||
servers specified on the command line. When a reply is received, it
|
||||
is broadcast or unicast on the network from whence the original
|
||||
request came.
|
||||
.PP
|
||||
It is possible to specify a set of interfaces on which dhcrelay will
|
||||
listen, so that if dhcrelay is connected through one interface to a
|
||||
network on which there is no DHCP server, but is connected on another
|
||||
interface to a network on which there is a DHCP server, it will not
|
||||
relay DHCP and BOOTP requests from the network on which the server
|
||||
exists to that server. This is an imperfect solution.
|
||||
.SH COMMAND LINE
|
||||
.PP
|
||||
The names of the network interfaces that dhcrelay should attempt to
|
||||
configure may be specified on the command line using the
|
||||
.I -i
|
||||
option. If no interface names
|
||||
are specified on the command line dhcrelay will identify all network
|
||||
interfaces, elimininating non-broadcast interfaces if possible, and
|
||||
attempt to configure each interface.
|
||||
.PP
|
||||
If dhcrelay should listen and transmit on a port other than the
|
||||
standard (port 67), the
|
||||
.B -p
|
||||
flag may used. It should be followed by the udp port number that
|
||||
dhcrelay should use. This is mostly useful for debugging purposes.
|
||||
.PP
|
||||
Dhclient will normally run in the foreground until it has configured
|
||||
an interface, and then will revert to running in the background.
|
||||
To run force dhcrelay to always run as a foreground process, the
|
||||
.B -d
|
||||
flag should be specified. This is useful when running dhcrelay under
|
||||
a debugger, or when running it out of inittab on System V systems.
|
||||
.PP
|
||||
The name of at least one DHCP server to which DHCP and BOOTP requests
|
||||
should be relayed must be specified on the command line.
|
||||
.PP
|
||||
.SH SEE ALSO
|
||||
dhclient(8), dhcpd(8), dhcrelay.conf(5), dhcrelay.leases(5)
|
||||
.SH AUTHOR
|
||||
.B dhcrelay(8)
|
||||
has been written for the Internet Software Consortium
|
||||
by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
|
||||
Enterprises. To learn more about the Internet Software Consortium,
|
||||
see
|
||||
.B http://www.vix.com/isc.
|
||||
To learn more about Vixie
|
||||
Enterprises, see
|
||||
.B http://www.vix.com.
|
||||
.PP
|
300
dhcrelay.c
300
dhcrelay.c
@ -1,300 +0,0 @@
|
||||
/* dhcrelay.c
|
||||
|
||||
DHCP/BOOTP Relay Agent. */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997 The Internet Software Consortium.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of The Internet Software Consortium nor the names
|
||||
* of its contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
|
||||
* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
||||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* This software has been written for the Internet Software Consortium
|
||||
* by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
|
||||
* Enterprises. To learn more about the Internet Software Consortium,
|
||||
* see ``http://www.vix.com/isc''. To learn more about Vixie
|
||||
* Enterprises, see ``http://www.vix.com''.
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char copyright[] =
|
||||
"$Id: dhcrelay.c,v 1.2 1997/02/22 12:28:26 mellon Exp $ Copyright (c) 1997 The Internet Software Consortium. All rights reserved.\n";
|
||||
#endif /* not lint */
|
||||
|
||||
#include "dhcpd.h"
|
||||
|
||||
static void usage PROTO ((void));
|
||||
|
||||
TIME cur_time;
|
||||
TIME default_lease_time = 43200; /* 12 hours... */
|
||||
TIME max_lease_time = 86400; /* 24 hours... */
|
||||
struct tree_cache *global_options [256];
|
||||
|
||||
int log_perror = 1;
|
||||
|
||||
#ifdef USE_FALLBACK
|
||||
struct interface_info fallback_interface;
|
||||
#endif
|
||||
|
||||
u_int16_t local_port;
|
||||
u_int16_t remote_port;
|
||||
int log_priority;
|
||||
|
||||
struct server_list {
|
||||
struct server_list *next;
|
||||
struct sockaddr_in to;
|
||||
} *servers;
|
||||
|
||||
int main (argc, argv, envp)
|
||||
int argc;
|
||||
char **argv, **envp;
|
||||
{
|
||||
int i;
|
||||
struct servent *ent;
|
||||
struct server_list *sp;
|
||||
int no_daemon;
|
||||
|
||||
#ifdef SYSLOG_4_2
|
||||
openlog ("dhcrelay", LOG_NDELAY);
|
||||
log_priority = LOG_DAEMON;
|
||||
#else
|
||||
openlog ("dhcrelay", LOG_NDELAY, LOG_DAEMON);
|
||||
#endif
|
||||
|
||||
#if !(defined (DEBUG) || defined (SYSLOG_4_2))
|
||||
setlogmask (LOG_UPTO (LOG_INFO));
|
||||
#endif
|
||||
|
||||
for (i = 1; i < argc; i++) {
|
||||
if (!strcmp (argv [i], "-p")) {
|
||||
if (++i == argc)
|
||||
usage ();
|
||||
local_port = htons (atoi (argv [i]));
|
||||
debug ("binding to user-specified port %d",
|
||||
ntohs (local_port));
|
||||
} else if (!strcmp (argv [i], "-d")) {
|
||||
no_daemon = 1;
|
||||
} else if (!strcmp (argv [i], "-i")) {
|
||||
struct interface_info *tmp =
|
||||
((struct interface_info *)
|
||||
dmalloc (sizeof *tmp, "specified_interface"));
|
||||
if (!tmp)
|
||||
error ("Insufficient memory to %s %s",
|
||||
"record interface", argv [i]);
|
||||
if (++i == argc) {
|
||||
usage ();
|
||||
}
|
||||
memset (tmp, 0, sizeof *tmp);
|
||||
strcpy (tmp -> name, argv [i]);
|
||||
tmp -> next = interfaces;
|
||||
tmp -> flags = INTERFACE_REQUESTED;
|
||||
interfaces = tmp;
|
||||
} else if (argv [i][0] == '-') {
|
||||
usage ();
|
||||
} else {
|
||||
struct hostent *he;
|
||||
he = gethostbyname (argv [i]);
|
||||
if (!he) {
|
||||
herror (argv [i]);
|
||||
} else {
|
||||
sp = (struct server_list *)malloc (sizeof *sp);
|
||||
if (!sp)
|
||||
error ("no memory for server.\n");
|
||||
sp -> next = servers;
|
||||
servers = sp;
|
||||
memcpy (&sp -> to.sin_addr,
|
||||
he -> h_addr_list [0], he -> h_length);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Default to the DHCP/BOOTP port. */
|
||||
if (!local_port) {
|
||||
ent = getservbyname ("dhcps", "udp");
|
||||
if (!ent)
|
||||
local_port = htons (67);
|
||||
else
|
||||
local_port = ent -> s_port;
|
||||
endservent ();
|
||||
}
|
||||
remote_port = htons (ntohs (local_port) + 1);
|
||||
|
||||
/* We need at least one server. */
|
||||
if (!sp) {
|
||||
usage ();
|
||||
}
|
||||
|
||||
/* Set up the server sockaddrs. */
|
||||
for (sp = servers; sp; sp = sp -> next) {
|
||||
sp -> to.sin_port = remote_port;
|
||||
sp -> to.sin_family = AF_INET;
|
||||
#ifdef HAVE_SA_LEN
|
||||
sp -> to.sin_len = sizeof sp -> to;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Get the current time... */
|
||||
GET_TIME (&cur_time);
|
||||
|
||||
/* Discover all the network interfaces. */
|
||||
discover_interfaces (DISCOVER_RELAY);
|
||||
|
||||
/* Start dispatching packets and timeouts... */
|
||||
dispatch (0);
|
||||
/*NOTREACHED*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
void relay (ip, packet, length)
|
||||
struct interface_info *ip;
|
||||
struct dhcp_packet *packet;
|
||||
int length;
|
||||
{
|
||||
struct server_list *sp;
|
||||
struct sockaddr_in to;
|
||||
struct interface_info *out;
|
||||
struct hardware hto;
|
||||
|
||||
/* If it's a bootreply, forward it to the client. */
|
||||
if (packet -> op == BOOTREPLY) {
|
||||
#ifndef USE_FALLBACK
|
||||
if (!packet -> flags & htons (BOOTP_BROADCAST)) {
|
||||
to.sin_addr = packet -> raw -> ciaddr;
|
||||
to.sin_port = remote_port;
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
to.sin_addr.s_addr = htonl (INADDR_BROADCAST);
|
||||
to.sin_port = remote_port;
|
||||
}
|
||||
to.sin_family = AF_INET;
|
||||
#ifdef HAVE_SA_LEN
|
||||
to.sin_len = sizeof to;
|
||||
#endif
|
||||
|
||||
memcpy (hto.haddr, packet -> chaddr,
|
||||
(packet -> hlen > sizeof hto.haddr
|
||||
? sizeof hto.haddr
|
||||
: packet -> hlen));
|
||||
hto.htype = packet -> htype;
|
||||
|
||||
/* Find the interface that corresponds to the giaddr
|
||||
in the packet. */
|
||||
for (out = interfaces; out; out = out -> next) {
|
||||
if (!memcmp (&out -> primary_address,
|
||||
&packet -> giaddr,
|
||||
sizeof packet -> giaddr))
|
||||
break;
|
||||
}
|
||||
if (!out) {
|
||||
warn ("packet to bogus giaddr %s.\n",
|
||||
inet_ntoa (packet -> giaddr));
|
||||
return;
|
||||
}
|
||||
|
||||
if (send_packet (out,
|
||||
(struct packet *)0,
|
||||
packet, length, out -> primary_address,
|
||||
&to, &hto) < 0)
|
||||
debug ("sendpkt: %m");
|
||||
else
|
||||
debug ("forwarded BOOTREPLY for %s to %s",
|
||||
print_hw_addr (packet -> htype, packet -> hlen,
|
||||
packet -> chaddr),
|
||||
inet_ntoa (to.sin_addr));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* If giaddr is set on a BOOTREQUEST, ignore it - it's already
|
||||
been gatewayed. */
|
||||
if (packet -> giaddr.s_addr) {
|
||||
note ("ignoring BOOTREQUEST with giaddr of %s\n",
|
||||
inet_ntoa (packet -> giaddr));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set the giaddr so the server can figure out what net it's
|
||||
from and so that we can later forward the response to the
|
||||
correct net. */
|
||||
packet -> giaddr = ip -> primary_address;
|
||||
|
||||
/* Otherwise, it's a BOOTREQUEST, so forward it to all the
|
||||
servers. */
|
||||
for (sp = servers; sp; sp = sp -> next) {
|
||||
if (
|
||||
#ifdef USE_FALLBACK
|
||||
send_fallback (&fallback_interface,
|
||||
(struct packet *)0,
|
||||
packet, length, ip -> primary_address,
|
||||
&sp -> to, (struct hardware *)0)
|
||||
#else
|
||||
send_packet (interfaces,
|
||||
(struct packet *)0,
|
||||
packet, length, ip -> primary_address,
|
||||
&sp -> to, (struct hardware *)0)
|
||||
#endif
|
||||
< 0) {
|
||||
debug ("send_packet: %m");
|
||||
} else {
|
||||
debug ("forwarded BOOTREQUEST for %s to %s",
|
||||
print_hw_addr (packet -> htype, packet -> hlen,
|
||||
packet -> chaddr),
|
||||
inet_ntoa (sp -> to.sin_addr));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void usage ()
|
||||
{
|
||||
error ("Usage: dhcrelay [-c] [-p <port>] [server1 [... serverN]]");
|
||||
}
|
||||
|
||||
void cleanup ()
|
||||
{
|
||||
}
|
||||
|
||||
int write_lease (lease)
|
||||
struct lease *lease;
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int commit_leases ()
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void bootp (packet)
|
||||
struct packet *packet;
|
||||
{
|
||||
}
|
||||
|
||||
void dhcp (packet)
|
||||
struct packet *packet;
|
||||
{
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user