mirror of
https://gitlab.isc.org/isc-projects/dhcp
synced 2025-08-23 18:38:00 +00:00
Subroutinize some functionality and add in tracing hooks.
This commit is contained in:
parent
a568b5bc45
commit
fc33f8c58e
@ -43,7 +43,7 @@
|
|||||||
|
|
||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char copyright[] =
|
static char copyright[] =
|
||||||
"$Id: discover.c,v 1.36 2001/01/03 23:13:46 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
"$Id: discover.c,v 1.37 2001/02/12 19:40:05 mellon Exp $ Copyright (c) 1995-2000 The Internet Software Consortium. All rights reserved.\n";
|
||||||
#endif /* not lint */
|
#endif /* not lint */
|
||||||
|
|
||||||
#include "dhcpd.h"
|
#include "dhcpd.h"
|
||||||
@ -67,6 +67,14 @@ void (*bootp_packet_handler) PROTO ((struct interface_info *,
|
|||||||
struct iaddr, struct hardware *));
|
struct iaddr, struct hardware *));
|
||||||
|
|
||||||
omapi_object_type_t *dhcp_type_interface;
|
omapi_object_type_t *dhcp_type_interface;
|
||||||
|
#if defined (TRACING)
|
||||||
|
trace_type_t *interface_trace;
|
||||||
|
trace_type_t *inpacket_trace;
|
||||||
|
trace_type_t *outpacket_trace;
|
||||||
|
#endif
|
||||||
|
struct interface_info **interface_vector;
|
||||||
|
int interface_count;
|
||||||
|
int interface_max;
|
||||||
|
|
||||||
OMAPI_OBJECT_ALLOC (interface, struct interface_info, dhcp_type_interface)
|
OMAPI_OBJECT_ALLOC (interface, struct interface_info, dhcp_type_interface)
|
||||||
|
|
||||||
@ -89,9 +97,25 @@ isc_result_t interface_setup ()
|
|||||||
if (status != ISC_R_SUCCESS)
|
if (status != ISC_R_SUCCESS)
|
||||||
log_fatal ("Can't register interface object type: %s",
|
log_fatal ("Can't register interface object type: %s",
|
||||||
isc_result_totext (status));
|
isc_result_totext (status));
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined (TRACING)
|
||||||
|
void interface_trace_setup ()
|
||||||
|
{
|
||||||
|
interface_trace = trace_type_register ("interface", (void *)0,
|
||||||
|
trace_interface_input,
|
||||||
|
trace_interface_stop, MDL);
|
||||||
|
inpacket_trace = trace_type_register ("inpacket", (void *)0,
|
||||||
|
trace_inpacket_input,
|
||||||
|
trace_inpacket_stop, MDL);
|
||||||
|
outpacket_trace = trace_type_register ("outpacket", (void *)0,
|
||||||
|
trace_outpacket_input,
|
||||||
|
trace_outpacket_stop, MDL);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
isc_result_t interface_initialize (omapi_object_t *ipo,
|
isc_result_t interface_initialize (omapi_object_t *ipo,
|
||||||
const char *file, int line)
|
const char *file, int line)
|
||||||
{
|
{
|
||||||
@ -215,19 +239,9 @@ void discover_interfaces (state)
|
|||||||
ifp -> ifr_name,
|
ifp -> ifr_name,
|
||||||
isc_result_totext (status));
|
isc_result_totext (status));
|
||||||
strcpy (tmp -> name, ifp -> ifr_name);
|
strcpy (tmp -> name, ifp -> ifr_name);
|
||||||
tmp -> circuit_id = (u_int8_t *)tmp -> name;
|
interface_snorf (tmp, ir);
|
||||||
tmp -> circuit_id_len = strlen (tmp -> name);
|
|
||||||
tmp -> remote_id = 0;
|
|
||||||
tmp -> remote_id_len = 0;
|
|
||||||
tmp -> flags = ir;
|
|
||||||
if (interfaces) {
|
|
||||||
interface_reference (&tmp -> next,
|
|
||||||
interfaces, MDL);
|
|
||||||
interface_dereference (&interfaces, MDL);
|
|
||||||
}
|
|
||||||
interface_reference (&interfaces, tmp, MDL);
|
|
||||||
interface_dereference (&tmp, MDL);
|
interface_dereference (&tmp, MDL);
|
||||||
tmp = interfaces;
|
tmp = interfaces; /* XXX */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dhcp_interface_discovery_hook)
|
if (dhcp_interface_discovery_hook)
|
||||||
@ -494,10 +508,13 @@ void discover_interfaces (state)
|
|||||||
if (interfaces)
|
if (interfaces)
|
||||||
interface_dereference (&interfaces,
|
interface_dereference (&interfaces,
|
||||||
MDL);
|
MDL);
|
||||||
|
if (next)
|
||||||
interface_reference (&interfaces, next, MDL);
|
interface_reference (&interfaces, next, MDL);
|
||||||
} else {
|
} else {
|
||||||
interface_dereference (&last -> next, MDL);
|
interface_dereference (&last -> next, MDL);
|
||||||
interface_reference (&last -> next, next, MDL);
|
if (next)
|
||||||
|
interface_reference (&last -> next,
|
||||||
|
next, MDL);
|
||||||
}
|
}
|
||||||
if (tmp -> next)
|
if (tmp -> next)
|
||||||
interface_dereference (&tmp -> next, MDL);
|
interface_dereference (&tmp -> next, MDL);
|
||||||
@ -564,9 +581,15 @@ void discover_interfaces (state)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Flag the index as not having been set, so that the
|
||||||
|
interface registerer can set it or not as it chooses. */
|
||||||
|
tmp -> index = -1;
|
||||||
|
|
||||||
/* Register the interface... */
|
/* Register the interface... */
|
||||||
if_register_receive (tmp);
|
if_register_receive (tmp);
|
||||||
if_register_send (tmp);
|
if_register_send (tmp);
|
||||||
|
|
||||||
|
interface_stash (tmp);
|
||||||
wifcount++;
|
wifcount++;
|
||||||
#if defined (HAVE_SETFD)
|
#if defined (HAVE_SETFD)
|
||||||
if (fcntl (tmp -> rfdesc, F_SETFD, 1) < 0)
|
if (fcntl (tmp -> rfdesc, F_SETFD, 1) < 0)
|
||||||
@ -647,6 +670,8 @@ int setup_fallback (struct interface_info **fp, const char *file, int line)
|
|||||||
(*dhcp_interface_setup_hook) (fallback_interface,
|
(*dhcp_interface_setup_hook) (fallback_interface,
|
||||||
(struct iaddr *)0);
|
(struct iaddr *)0);
|
||||||
status = interface_reference (fp, fallback_interface, file, line);
|
status = interface_reference (fp, fallback_interface, file, line);
|
||||||
|
|
||||||
|
interface_stash (fallback_interface);
|
||||||
return status == ISC_R_SUCCESS;
|
return status == ISC_R_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1005,3 +1030,56 @@ isc_result_t dhcp_interface_remove (omapi_object_t *lp,
|
|||||||
|
|
||||||
return ISC_R_SUCCESS;
|
return ISC_R_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void interface_stash (struct interface_info *tptr)
|
||||||
|
{
|
||||||
|
struct interface_info **vec;
|
||||||
|
int delta;
|
||||||
|
|
||||||
|
/* If the registerer didn't assign an index, assign one now. */
|
||||||
|
if (tptr -> index == -1) {
|
||||||
|
tptr -> index = interface_count++;
|
||||||
|
while (tptr -> index < interface_max &&
|
||||||
|
interface_vector [tptr -> index])
|
||||||
|
tptr -> index = interface_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interface_max <= tptr -> index) {
|
||||||
|
delta = tptr -> index - interface_max + 10;
|
||||||
|
vec = dmalloc ((interface_max + delta) *
|
||||||
|
sizeof (struct interface_info *), MDL);
|
||||||
|
if (!vec)
|
||||||
|
return;
|
||||||
|
memset (&vec [interface_max], 0,
|
||||||
|
(sizeof (struct interface_info *)) * delta);
|
||||||
|
interface_max += delta;
|
||||||
|
if (interface_vector) {
|
||||||
|
memcpy (vec, interface_vector,
|
||||||
|
(interface_count *
|
||||||
|
sizeof (struct interface_info *)));
|
||||||
|
dfree (interface_vector, MDL);
|
||||||
|
}
|
||||||
|
interface_vector = vec;
|
||||||
|
}
|
||||||
|
interface_vector [tptr -> index] = tptr;
|
||||||
|
if (tptr -> index >= interface_count)
|
||||||
|
interface_count = tptr -> index + 1;
|
||||||
|
#if defined (TRACING)
|
||||||
|
trace_interface_register (interface_trace, tptr);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void interface_snorf (struct interface_info *tmp, int ir)
|
||||||
|
{
|
||||||
|
tmp -> circuit_id = (u_int8_t *)tmp -> name;
|
||||||
|
tmp -> circuit_id_len = strlen (tmp -> name);
|
||||||
|
tmp -> remote_id = 0;
|
||||||
|
tmp -> remote_id_len = 0;
|
||||||
|
tmp -> flags = ir;
|
||||||
|
if (interfaces) {
|
||||||
|
interface_reference (&tmp -> next,
|
||||||
|
interfaces, MDL);
|
||||||
|
interface_dereference (&interfaces, MDL);
|
||||||
|
}
|
||||||
|
interface_reference (&interfaces, tmp, MDL);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user