2
0
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:
Ted Lemon 1997-02-22 12:58:31 +00:00
parent 034aa896ce
commit 6e5382c00d
2 changed files with 0 additions and 423 deletions

View File

@ -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

View File

@ -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;
{
}