37 memset (&tipkt, 0,
sizeof tipkt);
39 &
ip -> hw_address,
sizeof ip -> hw_address);
40 if (
ip->address_count)
42 ip->addresses,
sizeof(*
ip->addresses));
43 memcpy (tipkt.
name,
ip -> name,
sizeof ip -> name);
44 tipkt.
index = htonl (
ip -> index);
54 struct sockaddr_in *sin;
58 if (
len !=
sizeof *tipkt) {
59 log_error (
"trace interface packet size mismatch: %ld != %d",
60 (
long)(
sizeof *tipkt),
len);
66 status = interface_allocate (&
ip,
MDL);
70 isc_result_totext (status));
75 interface_dereference (&
ip,
MDL);
76 status = ISC_R_NOMEMORY;
85 ip->address_count =
ip->address_max = 1;
90 interface_dereference (&
ip,
MDL);
91 status = ISC_R_NOMEMORY;
100 (*dhcp_interface_discovery_hook) (
ip);
105 ip ->
ifp -> ifr_addr.sa_len =
sizeof (
struct sockaddr_in);
107 sin = (
struct sockaddr_in *)&
ip -> ifp -> ifr_addr;
108 sin->sin_addr =
ip->addresses[0];
111 memcpy (addr.iabuf, &sin -> sin_addr.s_addr, addr.len);
113 (*dhcp_interface_setup_hook) (
ip, &addr);
117 log_info (
"Listening on Trace/%s/%s%s%s",
120 ip -> hw_address.hlen - 1,
121 &
ip -> hw_address.hbuf [1]),
125 if (strcmp (
ip -> name,
"fallback")) {
126 log_info (
"Sending on Trace/%s/%s%s%s",
129 ip -> hw_address.hlen - 1,
130 &
ip -> hw_address.hbuf [1]),
136 interface_dereference (&
ip,
MDL);
146 unsigned int from_port,
165 tip.
index = htonl (interface -> index);
167 iov [0].
buf = (
char *)&tip;
168 iov [0].
len =
sizeof tip;
179 if (len <
sizeof *tip) {
180 log_error (
"trace_input_packet: too short - %d", len);
184 index = ntohl (tip -> index);
185 tip -> from.
len = ntohl (tip -> from.
len);
190 log_error (
"trace_input_packet: unknown interface index %d",
196 log_error (
"trace_input_packet: no bootp packet handler.");
217 struct sockaddr_in *to,
228 memset (&tip.
hto, 0,
sizeof tip.
hto);
234 memcpy (tip.
to.
iabuf, &to -> sin_addr, 4);
236 tip.
index = htonl (interface -> index);
238 iov [0].
buf = (
char *)&tip;
239 iov [0].
len =
sizeof tip;
240 iov [1].
buf = (
char *)raw;
256 if (len <
sizeof *tip) {
257 log_error (
"trace_input_packet: too short - %d", len);
261 index = ntohl (tip -> index);
266 log_error (
"trace_input_packet: unknown interface index %d",
281 outseed = htonl (seed);
290 if (length !=
sizeof seed) {
291 log_error (
"trace_seed_input: wrong size (%d)", length);
293 seed = (u_int32_t *)buf;
294 srandom (ntohl (*seed));
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
void trace_interface_input(trace_type_t *, unsigned, char *)
void trace_seed_input(trace_type_t *, unsigned, char *)
void trace_interface_register(trace_type_t *, struct interface_info *)
void trace_outpacket_input(trace_type_t *, unsigned, char *)
void trace_seed_stop(trace_type_t *)
void trace_inpacket_input(trace_type_t *, unsigned, char *)
void trace_interface_stop(trace_type_t *)
ssize_t trace_packet_send(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
void trace_inpacket_stash(struct interface_info *, struct dhcp_packet *, unsigned, unsigned int, struct iaddr, struct hardware *)
void trace_outpacket_stop(trace_type_t *)
void trace_seed_stash(trace_type_t *, unsigned)
void trace_inpacket_stop(trace_type_t *)
trace_type_t * inpacket_trace
trace_type_t * outpacket_trace
ssize_t send_packet(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
int(* dhcp_interface_discovery_hook)(struct interface_info *)
int quiet_interface_discovery
int(* dhcp_interface_setup_hook)(struct interface_info *, struct iaddr *)
struct interface_info ** interface_vector
void(* bootp_packet_handler)(struct interface_info *, struct dhcp_packet *, unsigned, unsigned int, struct iaddr, struct hardware *)
void interface_stash(struct interface_info *tptr)
void interface_snorf(struct interface_info *tmp, int ir)
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int log_info(const char *,...) __attribute__((__format__(__printf__
struct hardware hw_address
struct in_addr primary_address
struct hardware hw_address
struct trace_iov trace_iov_t
isc_result_t trace_write_packet(trace_type_t *, unsigned, const char *, const char *, int)
struct trace_type trace_type_t
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)