37 memset (&tipkt, 0,
sizeof tipkt);
39 &ip -> hw_address,
sizeof ip -> hw_address);
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);
67 if (status != ISC_R_SUCCESS) {
70 isc_result_totext (status));
75 interface_dereference (&ip,
MDL);
76 status = ISC_R_NOMEMORY;
93 (*dhcp_interface_discovery_hook) (ip);
96 memcpy (ip ->
ifp -> ifr_name, ip ->
name,
sizeof ip ->
name);
98 ip ->
ifp -> ifr_addr.sa_len =
sizeof (
struct sockaddr_in);
100 sin = (
struct sockaddr_in *)&ip -> ifp -> ifr_addr;
104 memcpy (addr.iabuf, &sin -> sin_addr.s_addr, addr.len);
106 (*dhcp_interface_setup_hook) (ip, &addr);
110 log_info (
"Listening on Trace/%s/%s%s%s",
113 ip -> hw_address.hlen - 1,
114 &ip -> hw_address.hbuf [1]),
118 if (strcmp (ip -> name,
"fallback")) {
119 log_info (
"Sending on Trace/%s/%s%s%s",
122 ip -> hw_address.hlen - 1,
123 &ip -> hw_address.hbuf [1]),
129 interface_dereference (&ip,
MDL);
139 unsigned int from_port,
158 tip.
index = htonl (interface -> index);
160 iov [0].
buf = (
char *)&tip;
161 iov [0].
len =
sizeof tip;
162 iov [1].
buf = (
char *)packet;
172 if (len <
sizeof *tip) {
173 log_error (
"trace_input_packet: too short - %d", len);
177 index = ntohl (tip -> index);
178 tip -> from.
len = ntohl (tip -> from.
len);
183 log_error (
"trace_input_packet: unknown interface index %d",
189 log_error (
"trace_input_packet: no bootp packet handler.");
206 struct packet *packet,
210 struct sockaddr_in *to,
221 memset (&tip.
hto, 0,
sizeof tip.
hto);
227 memcpy (tip.
to.
iabuf, &to -> sin_addr, 4);
229 tip.
index = htonl (interface -> index);
231 iov [0].
buf = (
char *)&tip;
232 iov [0].
len =
sizeof tip;
233 iov [1].
buf = (
char *)raw;
249 if (len <
sizeof *tip) {
250 log_error (
"trace_input_packet: too short - %d", len);
254 index = ntohl (tip -> index);
259 log_error (
"trace_input_packet: unknown interface index %d",
274 outseed = htonl (seed);
283 if (length !=
sizeof seed) {
284 log_error (
"trace_seed_input: wrong size (%d)", length);
286 seed = (u_int32_t *)buf;
287 srandom (ntohl (*seed));
void(* bootp_packet_handler)(struct interface_info *, struct dhcp_packet *, unsigned, unsigned int, struct iaddr, struct hardware *)
void * dmalloc(unsigned, const char *, int)
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
void trace_interface_register(trace_type_t *, struct interface_info *)
void trace_outpacket_input(trace_type_t *, unsigned, char *)
isc_result_t trace_write_packet_iov(trace_type_t *, int, trace_iov_t *, const char *, int)
struct in_addr * addresses
int log_error(const char *,...) __attribute__((__format__(__printf__
struct in_addr primary_address
void trace_outpacket_stop(trace_type_t *)
void trace_inpacket_stop(trace_type_t *)
void trace_seed_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_input(trace_type_t *, unsigned, char *)
trace_type_t * inpacket_trace
ssize_t send_packet(struct interface_info *, struct packet *, struct dhcp_packet *, size_t, struct in_addr, struct sockaddr_in *, struct hardware *)
struct hardware hw_address
int int log_info(const char *,...) __attribute__((__format__(__printf__
void trace_seed_stash(trace_type_t *, unsigned)
void interface_snorf(struct interface_info *tmp, int ir)
int(* dhcp_interface_setup_hook)(struct interface_info *, struct iaddr *)
int quiet_interface_discovery
isc_result_t trace_write_packet(trace_type_t *, unsigned, const char *, const char *, int)
int(* dhcp_interface_discovery_hook)(struct interface_info *)
void trace_interface_input(trace_type_t *, unsigned, char *)
void trace_inpacket_stash(struct interface_info *, struct dhcp_packet *, unsigned, unsigned int, struct iaddr, struct hardware *)
struct hardware hw_address
struct interface_info ** interface_vector
void interface_stash(struct interface_info *tptr)
trace_type_t * outpacket_trace
void trace_seed_input(trace_type_t *, unsigned, char *)
void trace_interface_stop(trace_type_t *)