2 * Copyright (c) 2002 - 2003
3 * NetGroup, Politecnico di Torino (Italy)
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the Politecnico di Torino nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 #include <errno.h> // for the errno variable
40 #include <stdlib.h> // for malloc(), free(), ...
41 #include <string.h> // for strlen(), ...
42 #include <limits.h> // for INT_MAX
45 #include <process.h> // for threads
51 #include <sys/types.h> // for select() and such
52 #include <pwd.h> // for password management
56 #include <shadow.h> // for password management
59 #include <pcap.h> // for libpcap/WinPcap calls
62 #include "sockutils.h" // for socket calls
63 #include "portability.h"
64 #include "rpcap-protocol.h"
69 #include <openssl/ssl.h>
74 // Timeout, in seconds, when we're waiting for a client to send us an
75 // authentication request; if they don't send us a request within that
76 // interval, we drop the connection, so we don't stay stuck forever.
78 #define RPCAP_TIMEOUT_INIT 90
81 // Timeout, in seconds, when we're waiting for an authenticated client
82 // to send us a request, if a capture isn't in progress; if they don't
83 // send us a request within that interval, we drop the connection, so
84 // we don't stay stuck forever.
86 #define RPCAP_TIMEOUT_RUNTIME 180
89 // Time, in seconds, that we wait after a failed authentication attempt
90 // before processing the next request; this prevents a client from
91 // rapidly trying different accounts or passwords.
93 #define RPCAP_SUSPEND_WRONGAUTH 1
95 // Parameters for the service loop.
98 SOCKET sockctrl
; //!< SOCKET ID of the control connection
99 SSL
*ssl
; //!< Optional SSL handler for the controlling sockets
100 int isactive
; //!< Not null if the daemon has to run in active mode
101 int nullAuthAllowed
; //!< '1' if we permit NULL authentication, '0' otherwise
105 // Data for a session managed by a thread.
106 // It includes both a Boolean indicating whether we *have* a thread,
107 // and a platform-dependent (UN*X vs. Windows) identifier for the
108 // thread; on Windows, we could use an invalid handle to indicate
109 // that we don't have a thread, but there *is* no portable "no thread"
110 // value for a pthread_t on UN*X.
115 SSL
*ctrl_ssl
, *data_ssl
; // optional SSL handlers for sockctrl and sockdata.
116 uint8 protocol_version
;
118 unsigned int TotCapt
;
127 // Locally defined functions
128 static int daemon_msg_err(SOCKET sockctrl
, SSL
*, uint32 plen
);
129 static int daemon_msg_auth_req(struct daemon_slpars
*pars
, uint32 plen
);
130 static int daemon_AuthUserPwd(char *username
, char *password
, char *errbuf
);
132 static int daemon_msg_findallif_req(uint8 ver
, struct daemon_slpars
*pars
,
135 static int daemon_msg_open_req(uint8 ver
, struct daemon_slpars
*pars
,
136 uint32 plen
, char *source
, size_t sourcelen
);
137 static int daemon_msg_startcap_req(uint8 ver
, struct daemon_slpars
*pars
,
138 uint32 plen
, char *source
, struct session
**sessionp
,
139 struct rpcap_sampling
*samp_param
, int uses_ssl
);
140 static int daemon_msg_endcap_req(uint8 ver
, struct daemon_slpars
*pars
,
141 struct session
*session
);
143 static int daemon_msg_updatefilter_req(uint8 ver
, struct daemon_slpars
*pars
,
144 struct session
*session
, uint32 plen
);
145 static int daemon_unpackapplyfilter(SOCKET sockctrl
, SSL
*, struct session
*session
, uint32
*plenp
, char *errbuf
);
147 static int daemon_msg_stats_req(uint8 ver
, struct daemon_slpars
*pars
,
148 struct session
*session
, uint32 plen
, struct pcap_stat
*stats
,
149 unsigned int svrcapt
);
151 static int daemon_msg_setsampling_req(uint8 ver
, struct daemon_slpars
*pars
,
152 uint32 plen
, struct rpcap_sampling
*samp_param
);
154 static void daemon_seraddr(struct sockaddr_storage
*sockaddrin
, struct rpcap_sockaddr
*sockaddrout
);
156 static unsigned __stdcall
daemon_thrdatamain(void *ptr
);
158 static void *daemon_thrdatamain(void *ptr
);
159 static void noop_handler(int sign
);
162 static int rpcapd_recv_msg_header(SOCKET sock
, SSL
*, struct rpcap_header
*headerp
);
163 static int rpcapd_recv(SOCKET sock
, SSL
*, char *buffer
, size_t toread
, uint32
*plen
, char *errmsgbuf
);
164 static int rpcapd_discard(SOCKET sock
, SSL
*, uint32 len
);
165 static void session_close(struct session
*);
168 // TLS record layer header; used when processing the first message from
169 // the client, in case we aren't doing TLS but they are.
171 struct tls_record_header
{
172 uint8 type
; // ContentType - will be 22, for Handshake
173 uint8 version_major
; // TLS protocol major version
174 uint8 version_injor
; // TLS protocol minor version
175 // This is *not* aligned on a 2-byte boundary; we just
176 // declare it as two bytes. Don't assume any particular
177 // compiler's mechanism for saying "packed"!
178 uint8 length_hi
; // Upper 8 bits of payload length
179 uint8 length_lo
; // Low 8 bits of payload length
182 #define TLS_RECORD_HEADER_LEN 5 // Don't use sizeof in case it's padded
184 #define TLS_RECORD_TYPE_ALERT 21
185 #define TLS_RECORD_TYPE_HANDSHAKE 22
188 // TLS alert message.
192 uint8 alert_description
;
195 #define TLS_ALERT_LEN 2
197 #define TLS_ALERT_LEVEL_FATAL 2
198 #define TLS_ALERT_HANDSHAKE_FAILURE 40
200 static int is_url(const char *source
);
203 daemon_serviceloop(SOCKET sockctrl
, int isactive
, char *passiveClients
,
204 int nullAuthAllowed
, int uses_ssl
)
207 struct tls_record_header tls_header
;
208 struct tls_alert tls_alert
;
209 struct daemon_slpars pars
; // service loop parameters
210 char errbuf
[PCAP_ERRBUF_SIZE
+ 1]; // keeps the error string, prior to be printed
211 char errmsgbuf
[PCAP_ERRBUF_SIZE
+ 1]; // buffer for errors to send to the client
212 int host_port_check_status
;
215 struct rpcap_header header
; // RPCAP message general header
216 uint32 plen
; // payload length from header
217 int authenticated
= 0; // 1 if the client has successfully authenticated
218 char source
[PCAP_BUF_SIZE
+1]; // keeps the string that contains the interface to open
219 int got_source
= 0; // 1 if we've gotten the source from an open request
221 struct sigaction action
;
223 struct session
*session
= NULL
; // struct session main variable
224 const char *msg_type_string
; // string for message type
225 int client_told_us_to_close
= 0; // 1 if the client told us to close the capture
227 // needed to save the values of the statistics
228 struct pcap_stat stats
;
229 unsigned int svrcapt
;
231 struct rpcap_sampling samp_param
; // in case sampling has been requested
233 // Structures needed for the select() call
234 fd_set rfds
; // set of socket descriptors we have to check
235 struct timeval tv
; // maximum time the select() can block waiting for data
236 int retval
; // select() return value
238 *errbuf
= 0; // Initialize errbuf
241 // Peek into the socket to determine whether the client sent us
242 // a TLS handshake message or a non-TLS rpcapd message.
244 // The first byte of an rpcapd request is the version number;
245 // the first byte of a TLS handshake message is 22. The
246 // first request to an rpcapd server must be an authentication
247 // request or a close request, and must have a version number
248 // of 0, so it will be possible to distinguish between an
249 // initial plaintext request to a server and an initial TLS
250 // handshake message.
252 nrecv
= sock_recv(sockctrl
, NULL
, (char *)&first_octet
, 1,
253 SOCK_EOF_ISNT_ERROR
|SOCK_MSG_PEEK
, errbuf
, PCAP_ERRBUF_SIZE
);
257 rpcapd_log(LOGPRIO_ERROR
, "Peek from client failed: %s", errbuf
);
262 // Client closed the connection.
268 // We have to upgrade to TLS as soon as possible, so that the
269 // whole protocol goes through the encrypted tunnel, including
270 // early error messages.
272 // Even in active mode, the other end has to initiate the TLS
273 // handshake as we still are the server as far as TLS is concerned,
274 // so we don't check isactive.
279 // We're expecting a TLS handshake message. If this
280 // isn't one, assume it's a non-TLS rpcapd message.
282 // The first octet of a TLS handshake is
283 // TLS_RECORD_TYPE_HANDSHAKE.
285 if (first_octet
!= TLS_RECORD_TYPE_HANDSHAKE
)
288 // We assume this is a non-TLS rpcapd message.
290 // Read the message header from the client.
292 nrecv
= rpcapd_recv_msg_header(sockctrl
, NULL
, &header
);
300 // Client closed the connection.
305 // Discard the rest of the message.
306 if (rpcapd_discard(sockctrl
, NULL
, plen
) == -1)
313 // Send an authentication error, indicating
314 // that we require TLS.
316 if (rpcap_senderror(sockctrl
, NULL
, header
.ver
,
317 PCAP_ERR_TLS_REQUIRED
,
318 "TLS is required by this server", errbuf
) == -1)
320 // That failed; log a message and give up.
321 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
325 // Shut the session down.
328 ssl
= ssl_promotion(1, sockctrl
, errbuf
, PCAP_ERRBUF_SIZE
);
331 rpcapd_log(LOGPRIO_ERROR
, "TLS handshake on control connection failed: %s",
340 // We're expecting a non-TLS rpcapd message. If this
341 // looks, instead, like a TLS handshake message, send
342 // a TLS handshake_failed alert.
344 // The first octet of a TLS handshake is
345 // TLS_RECORD_TYPE_HANDSHAKE.
347 if (first_octet
== TLS_RECORD_TYPE_HANDSHAKE
)
351 // Read the record header.
353 nrecv
= sock_recv(sockctrl
, ssl
, (char *) &tls_header
,
354 sizeof tls_header
, SOCK_RECEIVEALL_YES
|SOCK_EOF_ISNT_ERROR
,
355 errbuf
, PCAP_ERRBUF_SIZE
);
359 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
367 plen
= (tls_header
.length_hi
<< 8) | tls_header
.length_lo
;
369 // Discard the rest of the message.
370 if (rpcapd_discard(sockctrl
, NULL
, plen
) == -1)
377 // Send a TLS handshake failure alert.
378 // Use the same version the client sent us.
380 tls_header
.type
= TLS_RECORD_TYPE_ALERT
;
381 tls_header
.length_hi
= 0;
382 tls_header
.length_lo
= TLS_ALERT_LEN
;
384 if (sock_send(sockctrl
, NULL
, (char *) &tls_header
,
385 TLS_RECORD_HEADER_LEN
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
387 // That failed; log a messsage and give up.
388 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
392 tls_alert
.alert_level
= TLS_ALERT_LEVEL_FATAL
;
393 tls_alert
.alert_description
= TLS_ALERT_HANDSHAKE_FAILURE
;
394 if (sock_send(sockctrl
, NULL
, (char *) &tls_alert
,
395 TLS_ALERT_LEN
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
397 // That failed; log a messsage and give up.
398 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
408 // Set parameters structure
409 pars
.sockctrl
= sockctrl
;
411 pars
.isactive
= isactive
; // active mode
412 pars
.nullAuthAllowed
= nullAuthAllowed
;
415 // We have a connection.
417 // If it's a passive mode connection, check whether the connecting
418 // host is among the ones allowed.
420 // In either case, we were handed a copy of the host list; free it
421 // as soon as we're done with it.
426 free(passiveClients
);
427 passiveClients
= NULL
;
431 struct sockaddr_storage from
;
435 // Get the address of the other end of the connection.
437 fromlen
= sizeof(struct sockaddr_storage
);
438 if (getpeername(pars
.sockctrl
, (struct sockaddr
*)&from
,
441 sock_geterror("getpeername()", errmsgbuf
, PCAP_ERRBUF_SIZE
);
442 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
, 0, PCAP_ERR_NETW
, errmsgbuf
, errbuf
) == -1)
443 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
448 // Are they in the list of host/port combinations we allow?
450 host_port_check_status
= sock_check_hostlist(passiveClients
, RPCAP_HOSTLIST_SEP
, &from
, errmsgbuf
, PCAP_ERRBUF_SIZE
);
451 free(passiveClients
);
452 passiveClients
= NULL
;
453 if (host_port_check_status
< 0)
455 if (host_port_check_status
== -2) {
457 // We got an error; log it.
459 rpcapd_log(LOGPRIO_ERROR
, "%s", errmsgbuf
);
463 // Sorry, we can't let you in.
465 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
, 0, PCAP_ERR_HOSTNOAUTH
, errmsgbuf
, errbuf
) == -1)
466 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
473 // Catch SIGUSR1, but do nothing. We use it to interrupt the
474 // capture thread to break it out of a loop in which it's
475 // blocked waiting for packets to arrive.
477 // We don't want interrupted system calls to restart, so that
478 // the read routine for the pcap_t gets EINTR rather than
479 // restarting if it's blocked in a system call.
481 memset(&action
, 0, sizeof (action
));
482 action
.sa_handler
= noop_handler
;
484 sigemptyset(&action
.sa_mask
);
485 sigaction(SIGUSR1
, &action
, NULL
);
489 // The client must first authenticate; loop until they send us a
490 // message with a version we support and credentials we accept,
491 // they send us a close message indicating that they're giving up,
492 // or we get a network error or other fatal error.
494 while (!authenticated
)
497 // If we're not in active mode, we use select(), with a
498 // timeout, to wait for an authentication request; if
499 // the timeout expires, we drop the connection, so that
500 // a client can't just connect to us and leave us
506 // We do not have to block here
507 tv
.tv_sec
= RPCAP_TIMEOUT_INIT
;
510 FD_SET(pars
.sockctrl
, &rfds
);
512 retval
= select((int)pars
.sockctrl
+ 1, &rfds
, NULL
, NULL
, &tv
);
515 sock_geterror("select() failed", errmsgbuf
, PCAP_ERRBUF_SIZE
);
516 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
, 0, PCAP_ERR_NETW
, errmsgbuf
, errbuf
) == -1)
517 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
521 // The timeout has expired
522 // So, this was a fake connection. Drop it down
525 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
, 0, PCAP_ERR_INITTIMEOUT
, "The RPCAP initial timeout has expired", errbuf
) == -1)
526 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
532 // Read the message header from the client.
534 nrecv
= rpcapd_recv_msg_header(pars
.sockctrl
, pars
.ssl
, &header
);
542 // Client closed the connection.
549 // While we're in the authentication pharse, all requests
550 // must use version 0.
555 // Send it back to them with their version.
557 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
, header
.ver
,
559 "RPCAP version in requests in the authentication phase must be 0",
562 // That failed; log a message and give up.
563 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
567 // Discard the rest of the message and drop the
569 (void)rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
);
575 case RPCAP_MSG_AUTH_REQ
:
576 retval
= daemon_msg_auth_req(&pars
, plen
);
579 // Fatal error; a message has
580 // been logged, so just give up.
585 // Non-fatal error; we sent back
586 // an error message, so let them
591 // OK, we're authenticated; we sent back
592 // a reply, so start serving requests.
596 case RPCAP_MSG_CLOSE
:
598 // The client is giving up.
599 // Discard the rest of the message, if
600 // there is anything more.
602 (void)rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
);
603 // We're done with this client.
606 case RPCAP_MSG_ERROR
:
607 // Log this and close the connection?
608 // XXX - is this what happens in active
609 // mode, where *we* initiate the
610 // connection, and the client gives us
611 // an error message rather than a "let
612 // me log in" message, indicating that
613 // we're not allowed to connect to them?
614 (void)daemon_msg_err(pars
.sockctrl
, pars
.ssl
, plen
);
617 case RPCAP_MSG_FINDALLIF_REQ
:
618 case RPCAP_MSG_OPEN_REQ
:
619 case RPCAP_MSG_STARTCAP_REQ
:
620 case RPCAP_MSG_UPDATEFILTER_REQ
:
621 case RPCAP_MSG_STATS_REQ
:
622 case RPCAP_MSG_ENDCAP_REQ
:
623 case RPCAP_MSG_SETSAMPLING_REQ
:
625 // These requests can't be sent until
626 // the client is authenticated.
628 msg_type_string
= rpcap_msg_type_string(header
.type
);
629 if (msg_type_string
!= NULL
)
631 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "%s request sent before authentication was completed", msg_type_string
);
635 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Message of type %u sent before authentication was completed", header
.type
);
637 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
638 header
.ver
, PCAP_ERR_WRONGMSG
,
639 errmsgbuf
, errbuf
) == -1)
641 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
644 // Discard the rest of the message.
645 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
652 case RPCAP_MSG_PACKET
:
653 case RPCAP_MSG_FINDALLIF_REPLY
:
654 case RPCAP_MSG_OPEN_REPLY
:
655 case RPCAP_MSG_STARTCAP_REPLY
:
656 case RPCAP_MSG_UPDATEFILTER_REPLY
:
657 case RPCAP_MSG_AUTH_REPLY
:
658 case RPCAP_MSG_STATS_REPLY
:
659 case RPCAP_MSG_ENDCAP_REPLY
:
660 case RPCAP_MSG_SETSAMPLING_REPLY
:
662 // These are server-to-client messages.
664 msg_type_string
= rpcap_msg_type_string(header
.type
);
665 if (msg_type_string
!= NULL
)
667 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Server-to-client message %s received from client", msg_type_string
);
671 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Server-to-client message of type %u received from client", header
.type
);
673 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
674 header
.ver
, PCAP_ERR_WRONGMSG
,
675 errmsgbuf
, errbuf
) == -1)
677 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
680 // Discard the rest of the message.
681 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
690 // Unknown message type.
692 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Unknown message type %u", header
.type
);
693 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
694 header
.ver
, PCAP_ERR_WRONGMSG
,
695 errmsgbuf
, errbuf
) == -1)
697 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
700 // Discard the rest of the message.
701 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
711 // OK, the client has authenticated itself, and we can start
712 // processing regular requests from it.
716 // We don't have any statistics yet.
728 errbuf
[0] = 0; // clear errbuf
730 // Avoid zombies connections; check if the connection is opens but no commands are performed
731 // from more than RPCAP_TIMEOUT_RUNTIME
733 // - I have to be in normal mode (no active mode)
734 // - if the device is open, I don't have to be in the middle of a capture (session->sockdata)
735 // - if the device is closed, I have always to check if a new command arrives
737 // Be carefully: the capture can have been started, but an error occurred (so session != NULL, but
739 if ((!pars
.isactive
) && ((session
== NULL
) || ((session
!= NULL
) && (session
->sockdata
== 0))))
741 // Check for the initial timeout
743 // We do not have to block here
744 tv
.tv_sec
= RPCAP_TIMEOUT_RUNTIME
;
747 FD_SET(pars
.sockctrl
, &rfds
);
749 retval
= select((int)pars
.sockctrl
+ 1, &rfds
, NULL
, NULL
, &tv
);
752 sock_geterror("select() failed", errmsgbuf
, PCAP_ERRBUF_SIZE
);
753 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
755 errmsgbuf
, errbuf
) == -1)
756 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
760 // The timeout has expired
761 // So, this was a fake connection. Drop it down
764 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
765 0, PCAP_ERR_INITTIMEOUT
,
766 "The RPCAP initial timeout has expired",
768 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
774 // Read the message header from the client.
776 nrecv
= rpcapd_recv_msg_header(pars
.sockctrl
, pars
.ssl
, &header
);
784 // Client closed the connection.
791 // Did the client specify a protocol version that we
794 if (!RPCAP_VERSION_IS_SUPPORTED(header
.ver
))
797 // Tell them it's not a supported version.
798 // Send the error message with their version,
799 // so they don't reject it as having the wrong
802 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
803 header
.ver
, PCAP_ERR_WRONGVER
,
804 "RPCAP version in message isn't supported by the server",
807 // That failed; log a message and give up.
808 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
812 // Discard the rest of the message.
813 (void)rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
);
820 case RPCAP_MSG_ERROR
: // The other endpoint reported an error
822 (void)daemon_msg_err(pars
.sockctrl
, pars
.ssl
, plen
);
823 // Do nothing; just exit; the error code is already into the errbuf
824 // XXX - actually exit....
828 case RPCAP_MSG_FINDALLIF_REQ
:
830 if (daemon_msg_findallif_req(header
.ver
, &pars
, plen
) == -1)
832 // Fatal error; a message has
833 // been logged, so just give up.
839 case RPCAP_MSG_OPEN_REQ
:
842 // Process the open request, and keep
843 // the source from it, for use later
844 // when the capture is started.
846 // XXX - we don't care if the client sends
847 // us multiple open requests, the last
850 retval
= daemon_msg_open_req(header
.ver
, &pars
,
851 plen
, source
, sizeof(source
));
854 // Fatal error; a message has
855 // been logged, so just give up.
862 case RPCAP_MSG_STARTCAP_REQ
:
866 // They never told us what device
868 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
870 PCAP_ERR_STARTCAPTURE
,
871 "No capture device was specified",
874 // Fatal error; log an
875 // error and give up.
876 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
879 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
886 if (daemon_msg_startcap_req(header
.ver
, &pars
,
887 plen
, source
, &session
, &samp_param
,
890 // Fatal error; a message has
891 // been logged, so just give up.
897 case RPCAP_MSG_UPDATEFILTER_REQ
:
901 if (daemon_msg_updatefilter_req(header
.ver
,
902 &pars
, session
, plen
) == -1)
904 // Fatal error; a message has
905 // been logged, so just give up.
911 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
913 PCAP_ERR_UPDATEFILTER
,
914 "Device not opened. Cannot update filter",
917 // That failed; log a message and give up.
918 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
925 case RPCAP_MSG_CLOSE
: // The other endpoint close the pcap session
928 // Indicate to our caller that the client
929 // closed the control connection.
930 // This is used only in case of active mode.
932 client_told_us_to_close
= 1;
933 rpcapd_log(LOGPRIO_DEBUG
, "The other end system asked to close the connection.");
937 case RPCAP_MSG_STATS_REQ
:
939 if (daemon_msg_stats_req(header
.ver
, &pars
,
940 session
, plen
, &stats
, svrcapt
) == -1)
942 // Fatal error; a message has
943 // been logged, so just give up.
949 case RPCAP_MSG_ENDCAP_REQ
: // The other endpoint close the current capture session
953 // Save statistics (we can need them in the future)
954 if (pcap_stats(session
->fp
, &stats
))
956 svrcapt
= session
->TotCapt
;
966 if (daemon_msg_endcap_req(header
.ver
,
967 &pars
, session
) == -1)
971 // Fatal error; a message has
972 // been logged, so just give up.
980 rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
983 "Device not opened. Cannot close the capture",
989 case RPCAP_MSG_SETSAMPLING_REQ
:
991 if (daemon_msg_setsampling_req(header
.ver
,
992 &pars
, plen
, &samp_param
) == -1)
994 // Fatal error; a message has
995 // been logged, so just give up.
1001 case RPCAP_MSG_AUTH_REQ
:
1004 // We're already authenticated; you don't
1005 // get to reauthenticate.
1007 rpcapd_log(LOGPRIO_INFO
, "The client sent an RPCAP_MSG_AUTH_REQ message after authentication was completed");
1008 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
1011 "RPCAP_MSG_AUTH_REQ request sent after authentication was completed",
1014 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1017 // Discard the rest of the message.
1018 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
1025 case RPCAP_MSG_PACKET
:
1026 case RPCAP_MSG_FINDALLIF_REPLY
:
1027 case RPCAP_MSG_OPEN_REPLY
:
1028 case RPCAP_MSG_STARTCAP_REPLY
:
1029 case RPCAP_MSG_UPDATEFILTER_REPLY
:
1030 case RPCAP_MSG_AUTH_REPLY
:
1031 case RPCAP_MSG_STATS_REPLY
:
1032 case RPCAP_MSG_ENDCAP_REPLY
:
1033 case RPCAP_MSG_SETSAMPLING_REPLY
:
1035 // These are server-to-client messages.
1037 msg_type_string
= rpcap_msg_type_string(header
.type
);
1038 if (msg_type_string
!= NULL
)
1040 rpcapd_log(LOGPRIO_INFO
, "The client sent a %s server-to-client message", msg_type_string
);
1041 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Server-to-client message %s received from client", msg_type_string
);
1045 rpcapd_log(LOGPRIO_INFO
, "The client sent a server-to-client message of type %u", header
.type
);
1046 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Server-to-client message of type %u received from client", header
.type
);
1048 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
1049 header
.ver
, PCAP_ERR_WRONGMSG
,
1050 errmsgbuf
, errbuf
) == -1)
1052 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1055 // Discard the rest of the message.
1056 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
1065 // Unknown message type.
1067 rpcapd_log(LOGPRIO_INFO
, "The client sent a message of type %u", header
.type
);
1068 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Unknown message type %u", header
.type
);
1069 if (rpcap_senderror(pars
.sockctrl
, pars
.ssl
,
1070 header
.ver
, PCAP_ERR_WRONGMSG
,
1071 errbuf
, errmsgbuf
) == -1)
1073 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1076 // Discard the rest of the message.
1077 if (rpcapd_discard(pars
.sockctrl
, pars
.ssl
, plen
) == -1)
1088 // The service loop is finishing up.
1089 // If we have a capture session running, close it.
1092 session_close(session
);
1098 // Finish using the SSL handle for the control socket, if we
1099 // have an SSL connection, and close the control socket.
1104 // Finish using the SSL handle for the socket.
1105 // This must be done *before* the socket is closed.
1109 sock_close(sockctrl
, NULL
, 0);
1111 // Print message and return
1112 rpcapd_log(LOGPRIO_DEBUG
, "I'm exiting from the child loop");
1114 return client_told_us_to_close
;
1118 * This handles the RPCAP_MSG_ERR message.
1121 daemon_msg_err(SOCKET sockctrl
, SSL
*ssl
, uint32 plen
)
1123 char errbuf
[PCAP_ERRBUF_SIZE
];
1124 char remote_errbuf
[PCAP_ERRBUF_SIZE
];
1126 if (plen
>= PCAP_ERRBUF_SIZE
)
1129 * Message is too long; just read as much of it as we
1130 * can into the buffer provided, and discard the rest.
1132 if (sock_recv(sockctrl
, ssl
, remote_errbuf
, PCAP_ERRBUF_SIZE
- 1,
1133 SOCK_RECEIVEALL_YES
|SOCK_EOF_IS_ERROR
, errbuf
,
1134 PCAP_ERRBUF_SIZE
) == -1)
1137 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
1140 if (rpcapd_discard(sockctrl
, ssl
, plen
- (PCAP_ERRBUF_SIZE
- 1)) == -1)
1147 * Null-terminate it.
1149 remote_errbuf
[PCAP_ERRBUF_SIZE
- 1] = '\0';
1153 /* Empty error string. */
1154 remote_errbuf
[0] = '\0';
1158 if (sock_recv(sockctrl
, ssl
, remote_errbuf
, plen
,
1159 SOCK_RECEIVEALL_YES
|SOCK_EOF_IS_ERROR
, errbuf
,
1160 PCAP_ERRBUF_SIZE
) == -1)
1163 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
1168 * Null-terminate it.
1170 remote_errbuf
[plen
] = '\0';
1173 rpcapd_log(LOGPRIO_ERROR
, "Error from client: %s", remote_errbuf
);
1178 * This handles the RPCAP_MSG_AUTH_REQ message.
1179 * It checks if the authentication credentials supplied by the user are valid.
1181 * This function is called if the daemon receives a RPCAP_MSG_AUTH_REQ
1182 * message in its authentication loop. It reads the body of the
1183 * authentication message from the network and checks whether the
1184 * credentials are valid.
1186 * \param sockctrl: the socket for the control connection.
1188 * \param nullAuthAllowed: '1' if the NULL authentication is allowed.
1190 * \param errbuf: a user-allocated buffer in which the error message
1191 * (if one) has to be written. It must be at least PCAP_ERRBUF_SIZE
1194 * \return '0' if everything is fine, '-1' if an unrecoverable error occurred,
1195 * or '-2' if the authentication failed. For errors, an error message is
1196 * returned in the 'errbuf' variable; this gives a message for the
1197 * unrecoverable error or for the authentication failure.
1200 daemon_msg_auth_req(struct daemon_slpars
*pars
, uint32 plen
)
1202 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
1203 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
1205 struct rpcap_auth auth
; // RPCAP authentication header
1206 char sendbuf
[RPCAP_NETBUF_SIZE
]; // temporary buffer in which data to be sent is buffered
1207 int sendbufidx
= 0; // index which keeps the number of bytes currently buffered
1208 struct rpcap_authreply
*authreply
; // authentication reply message
1210 status
= rpcapd_recv(pars
->sockctrl
, pars
->ssl
, (char *) &auth
, sizeof(struct rpcap_auth
), &plen
, errmsgbuf
);
1220 switch (ntohs(auth
.type
))
1222 case RPCAP_RMTAUTH_NULL
:
1224 if (!pars
->nullAuthAllowed
)
1226 // Send the client an error reply.
1227 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
,
1228 "Authentication failed; NULL authentication not permitted.");
1229 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
,
1230 0, PCAP_ERR_AUTH_FAILED
, errmsgbuf
, errbuf
) == -1)
1232 // That failed; log a message and give up.
1233 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1241 case RPCAP_RMTAUTH_PWD
:
1243 char *username
, *passwd
;
1244 uint32 usernamelen
, passwdlen
;
1246 usernamelen
= ntohs(auth
.slen1
);
1247 username
= (char *) malloc (usernamelen
+ 1);
1248 if (username
== NULL
)
1250 pcap_fmt_errmsg_for_errno(errmsgbuf
,
1251 PCAP_ERRBUF_SIZE
, errno
, "malloc() failed");
1254 status
= rpcapd_recv(pars
->sockctrl
, pars
->ssl
, username
, usernamelen
, &plen
, errmsgbuf
);
1265 username
[usernamelen
] = '\0';
1267 passwdlen
= ntohs(auth
.slen2
);
1268 passwd
= (char *) malloc (passwdlen
+ 1);
1271 pcap_fmt_errmsg_for_errno(errmsgbuf
,
1272 PCAP_ERRBUF_SIZE
, errno
, "malloc() failed");
1276 status
= rpcapd_recv(pars
->sockctrl
, pars
->ssl
, passwd
, passwdlen
, &plen
, errmsgbuf
);
1289 passwd
[passwdlen
] = '\0';
1291 if (daemon_AuthUserPwd(username
, passwd
, errmsgbuf
))
1294 // Authentication failed. Let the client
1299 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
,
1300 0, PCAP_ERR_AUTH_FAILED
, errmsgbuf
, errbuf
) == -1)
1302 // That failed; log a message and give up.
1303 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1308 // Suspend for 1 second, so that they can't
1309 // hammer us with repeated tries with an
1310 // attack such as a dictionary attack.
1312 // WARNING: this delay is inserted only
1313 // at this point; if the client closes the
1314 // connection and reconnects, the suspension
1315 // time does not have any effect.
1317 sleep_secs(RPCAP_SUSPEND_WRONGAUTH
);
1327 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
,
1328 "Authentication type not recognized.");
1329 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
,
1330 0, PCAP_ERR_AUTH_TYPE_NOTSUP
, errmsgbuf
, errbuf
) == -1)
1332 // That failed; log a message and give up.
1333 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1339 // The authentication succeeded; let the client know.
1340 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
, &sendbufidx
,
1341 RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1344 rpcap_createhdr((struct rpcap_header
*) sendbuf
, 0,
1345 RPCAP_MSG_AUTH_REPLY
, 0, sizeof(struct rpcap_authreply
));
1347 authreply
= (struct rpcap_authreply
*) &sendbuf
[sendbufidx
];
1349 if (sock_bufferize(NULL
, sizeof(struct rpcap_authreply
), NULL
, &sendbufidx
,
1350 RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1354 // Indicate to our peer what versions we support.
1356 memset(authreply
, 0, sizeof(struct rpcap_authreply
));
1357 authreply
->minvers
= RPCAP_MIN_VERSION
;
1358 authreply
->maxvers
= RPCAP_MAX_VERSION
;
1361 if (sock_send(pars
->sockctrl
, pars
->ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
1363 // That failed; log a messsage and give up.
1364 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1368 // Check if all the data has been read; if not, discard the data in excess
1369 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
1377 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, 0, PCAP_ERR_AUTH
,
1378 errmsgbuf
, errbuf
) == -1)
1380 // That failed; log a message and give up.
1381 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1386 // Check if all the data has been read; if not, discard the data in excess
1387 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
1396 daemon_AuthUserPwd(char *username
, char *password
, char *errbuf
)
1400 * Warning: the user which launches the process must have the
1401 * SE_TCB_NAME right.
1402 * This corresponds to have the "Act as part of the Operating System"
1403 * turned on (administrative tools, local security settings, local
1404 * policies, user right assignment)
1405 * However, it seems to me that if you run it as a service, this
1406 * right should be provided by default.
1408 * XXX - hopefully, this returns errors such as ERROR_LOGON_FAILURE,
1409 * which merely indicates that the user name or password is
1410 * incorrect, not whether it's the user name or the password
1411 * that's incorrect, so a client that's trying to brute-force
1412 * accounts doesn't know whether it's the user name or the
1413 * password that's incorrect, so it doesn't know whether to
1414 * stop trying to log in with a given user name and move on
1415 * to another user name.
1419 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to log
1421 if (LogonUser(username
, ".", password
, LOGON32_LOGON_NETWORK
, LOGON32_PROVIDER_DEFAULT
, &Token
) == 0)
1423 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1424 error
= GetLastError();
1425 if (error
!= ERROR_LOGON_FAILURE
)
1427 // Some error other than an authentication error;
1429 pcap_fmt_errmsg_for_win32_err(errmsgbuf
,
1430 PCAP_ERRBUF_SIZE
, error
, "LogonUser() failed");
1431 rpcapd_log(LOGPRIO_ERROR
, "%s", errmsgbuf
);
1436 // This call should change the current thread to the selected user.
1437 // I didn't test it.
1438 if (ImpersonateLoggedOnUser(Token
) == 0)
1440 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1441 pcap_fmt_errmsg_for_win32_err(errmsgbuf
, PCAP_ERRBUF_SIZE
,
1442 GetLastError(), "ImpersonateLoggedOnUser() failed");
1443 rpcapd_log(LOGPRIO_ERROR
, "%s", errmsgbuf
);
1455 * http://www.unixpapa.com/incnote/passwd.html
1457 * We use the Solaris/Linux shadow password authentication if
1458 * we have getspnam(), otherwise we just do traditional
1459 * authentication, which, on some platforms, might work, even
1460 * with shadow passwords, if we're running as root. Traditional
1461 * authenticaion won't work if we're not running as root, as
1462 * I think these days all UN*Xes either won't return the password
1463 * at all with getpwnam() or will only do so if you're root.
1465 * XXX - perhaps what we *should* be using is PAM, if we have
1466 * it. That might hide all the details of username/password
1467 * authentication, whether it's done with a visible-to-root-
1468 * only password database or some other authentication mechanism,
1472 struct passwd
*user
;
1473 char *user_password
;
1474 #ifdef HAVE_GETSPNAM
1475 struct spwd
*usersp
;
1477 char *crypt_password
;
1479 // This call is needed to get the uid
1480 if ((user
= getpwnam(username
)) == NULL
)
1482 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1486 #ifdef HAVE_GETSPNAM
1487 // This call is needed to get the password; otherwise 'x' is returned
1488 if ((usersp
= getspnam(username
)) == NULL
)
1490 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1493 user_password
= usersp
->sp_pwdp
;
1496 * XXX - what about other platforms?
1497 * The unixpapa.com page claims this Just Works on *BSD if you're
1498 * running as root - it's from 2000, so it doesn't indicate whether
1499 * macOS (which didn't come out until 2001, under the name Mac OS
1500 * X) behaves like the *BSDs or not, and might also work on AIX.
1501 * HP-UX does something else.
1503 * Again, hopefully PAM hides all that.
1505 user_password
= user
->pw_passwd
;
1509 // The Single UNIX Specification says that if crypt() fails it
1510 // sets errno, but some implementatons that haven't been run
1511 // through the SUS test suite might not do so.
1514 crypt_password
= crypt(password
, user_password
);
1515 if (crypt_password
== NULL
)
1518 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1521 // It didn't set errno.
1522 rpcapd_log(LOGPRIO_ERROR
, "crypt() failed");
1526 rpcapd_log(LOGPRIO_ERROR
, "crypt() failed: %s",
1531 if (strcmp(user_password
, crypt_password
) != 0)
1533 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Authentication failed");
1537 if (setuid(user
->pw_uid
))
1540 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
1542 rpcapd_log(LOGPRIO_ERROR
, "setuid() failed: %s",
1547 /* if (setgid(user->pw_gid))
1550 pcap_fmt_errmsg_for_errno(errbuf, PCAP_ERRBUF_SIZE,
1552 rpcapd_log(LOGPRIO_ERROR, "setgid() failed: %s",
1564 daemon_msg_findallif_req(uint8 ver
, struct daemon_slpars
*pars
, uint32 plen
)
1566 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
1567 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
1568 char sendbuf
[RPCAP_NETBUF_SIZE
]; // temporary buffer in which data to be sent is buffered
1569 int sendbufidx
= 0; // index which keeps the number of bytes currently buffered
1570 pcap_if_t
*alldevs
= NULL
; // pointer to the header of the interface chain
1571 pcap_if_t
*d
; // temp pointer needed to scan the interface chain
1572 struct pcap_addr
*address
; // pcap structure that keeps a network address of an interface
1573 struct rpcap_findalldevs_if
*findalldevs_if
;// rpcap structure that packet all the data of an interface together
1574 uint32 replylen
; // length of reply payload
1575 uint16 nif
= 0; // counts the number of interface listed
1577 // Discard the rest of the message; there shouldn't be any payload.
1578 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
1584 // Retrieve the device list
1585 if (pcap_findalldevs(&alldevs
, errmsgbuf
) == -1)
1588 if (alldevs
== NULL
)
1590 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
,
1591 PCAP_ERR_NOREMOTEIF
,
1592 "No interfaces found! Make sure libpcap/WinPcap is properly installed"
1593 " and you have the right to access to the remote device.",
1596 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1602 // This checks the number of interfaces and computes the total
1603 // length of the payload.
1605 for (d
= alldevs
; d
!= NULL
; d
= d
->next
)
1610 replylen
+= strlen(d
->description
);
1612 replylen
+= strlen(d
->name
);
1614 replylen
+= sizeof(struct rpcap_findalldevs_if
);
1616 for (address
= d
->addresses
; address
!= NULL
; address
= address
->next
)
1619 * Send only IPv4 and IPv6 addresses over the wire.
1621 switch (address
->addr
->sa_family
)
1627 replylen
+= (sizeof(struct rpcap_sockaddr
) * 4);
1636 // RPCAP findalldevs command
1637 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
,
1638 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
,
1639 PCAP_ERRBUF_SIZE
) == -1)
1642 rpcap_createhdr((struct rpcap_header
*) sendbuf
, ver
,
1643 RPCAP_MSG_FINDALLIF_REPLY
, nif
, replylen
);
1645 // send the interface list
1646 for (d
= alldevs
; d
!= NULL
; d
= d
->next
)
1648 uint16 lname
, ldescr
;
1650 findalldevs_if
= (struct rpcap_findalldevs_if
*) &sendbuf
[sendbufidx
];
1652 if (sock_bufferize(NULL
, sizeof(struct rpcap_findalldevs_if
), NULL
,
1653 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1656 memset(findalldevs_if
, 0, sizeof(struct rpcap_findalldevs_if
));
1658 if (d
->description
) ldescr
= (short) strlen(d
->description
);
1660 if (d
->name
) lname
= (short) strlen(d
->name
);
1663 findalldevs_if
->desclen
= htons(ldescr
);
1664 findalldevs_if
->namelen
= htons(lname
);
1665 findalldevs_if
->flags
= htonl(d
->flags
);
1667 for (address
= d
->addresses
; address
!= NULL
; address
= address
->next
)
1670 * Send only IPv4 and IPv6 addresses over the wire.
1672 switch (address
->addr
->sa_family
)
1678 findalldevs_if
->naddr
++;
1685 findalldevs_if
->naddr
= htons(findalldevs_if
->naddr
);
1687 if (sock_bufferize(d
->name
, lname
, sendbuf
, &sendbufidx
,
1688 RPCAP_NETBUF_SIZE
, SOCKBUF_BUFFERIZE
, errmsgbuf
,
1689 PCAP_ERRBUF_SIZE
) == -1)
1692 if (sock_bufferize(d
->description
, ldescr
, sendbuf
, &sendbufidx
,
1693 RPCAP_NETBUF_SIZE
, SOCKBUF_BUFFERIZE
, errmsgbuf
,
1694 PCAP_ERRBUF_SIZE
) == -1)
1697 // send all addresses
1698 for (address
= d
->addresses
; address
!= NULL
; address
= address
->next
)
1700 struct rpcap_sockaddr
*sockaddr
;
1703 * Send only IPv4 and IPv6 addresses over the wire.
1705 switch (address
->addr
->sa_family
)
1711 sockaddr
= (struct rpcap_sockaddr
*) &sendbuf
[sendbufidx
];
1712 if (sock_bufferize(NULL
, sizeof(struct rpcap_sockaddr
), NULL
,
1713 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1715 daemon_seraddr((struct sockaddr_storage
*) address
->addr
, sockaddr
);
1717 sockaddr
= (struct rpcap_sockaddr
*) &sendbuf
[sendbufidx
];
1718 if (sock_bufferize(NULL
, sizeof(struct rpcap_sockaddr
), NULL
,
1719 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1721 daemon_seraddr((struct sockaddr_storage
*) address
->netmask
, sockaddr
);
1723 sockaddr
= (struct rpcap_sockaddr
*) &sendbuf
[sendbufidx
];
1724 if (sock_bufferize(NULL
, sizeof(struct rpcap_sockaddr
), NULL
,
1725 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1727 daemon_seraddr((struct sockaddr_storage
*) address
->broadaddr
, sockaddr
);
1729 sockaddr
= (struct rpcap_sockaddr
*) &sendbuf
[sendbufidx
];
1730 if (sock_bufferize(NULL
, sizeof(struct rpcap_sockaddr
), NULL
,
1731 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1733 daemon_seraddr((struct sockaddr_storage
*) address
->dstaddr
, sockaddr
);
1742 // We no longer need the device list. Free it.
1743 pcap_freealldevs(alldevs
);
1745 // Send a final command that says "now send it!"
1746 if (sock_send(pars
->sockctrl
, pars
->ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
1748 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1756 pcap_freealldevs(alldevs
);
1758 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
,
1759 PCAP_ERR_FINDALLIF
, errmsgbuf
, errbuf
) == -1)
1761 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1768 \param plen: the length of the current message (needed in order to be able
1769 to discard excess data in the message, if present)
1772 daemon_msg_open_req(uint8 ver
, struct daemon_slpars
*pars
, uint32 plen
,
1773 char *source
, size_t sourcelen
)
1775 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
1776 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
1777 pcap_t
*fp
; // pcap_t main variable
1779 char sendbuf
[RPCAP_NETBUF_SIZE
]; // temporary buffer in which data to be sent is buffered
1780 int sendbufidx
= 0; // index which keeps the number of bytes currently buffered
1781 struct rpcap_openreply
*openreply
; // open reply message
1783 if (plen
> sourcelen
- 1)
1785 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Source string too long");
1789 nread
= sock_recv(pars
->sockctrl
, pars
->ssl
, source
, plen
,
1790 SOCK_RECEIVEALL_YES
|SOCK_EOF_IS_ERROR
, errbuf
, PCAP_ERRBUF_SIZE
);
1793 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
1796 source
[nread
] = '\0';
1799 // Is this a URL rather than a device?
1800 // If so, reject it.
1803 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Source string refers to a remote device");
1807 // Open the selected device
1808 // This is a fake open, since we do that only to get the needed parameters, then we close the device again
1809 if ((fp
= pcap_open_live(source
,
1810 1500 /* fake snaplen */,
1812 1000 /* fake timeout */,
1813 errmsgbuf
)) == NULL
)
1816 // Now, I can send a RPCAP open reply message
1817 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
, &sendbufidx
,
1818 RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1821 rpcap_createhdr((struct rpcap_header
*) sendbuf
, ver
,
1822 RPCAP_MSG_OPEN_REPLY
, 0, sizeof(struct rpcap_openreply
));
1824 openreply
= (struct rpcap_openreply
*) &sendbuf
[sendbufidx
];
1826 if (sock_bufferize(NULL
, sizeof(struct rpcap_openreply
), NULL
, &sendbufidx
,
1827 RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
1830 memset(openreply
, 0, sizeof(struct rpcap_openreply
));
1831 openreply
->linktype
= htonl(pcap_datalink(fp
));
1833 * This is always 0 for live captures; we no longer support it
1834 * as something we read from capture files and supply to
1835 * clients, but we have to send it over the wire, as open
1836 * replies are expected to have 8 bytes of payload by
1839 openreply
->tzoff
= 0;
1841 // We're done with the pcap_t.
1845 if (sock_send(pars
->sockctrl
, pars
->ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
1847 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1853 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
, PCAP_ERR_OPEN
,
1854 errmsgbuf
, errbuf
) == -1)
1856 // That failed; log a message and give up.
1857 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
1861 // Check if all the data has been read; if not, discard the data in excess
1862 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
1870 \param plen: the length of the current message (needed in order to be able
1871 to discard excess data in the message, if present)
1874 daemon_msg_startcap_req(uint8 ver
, struct daemon_slpars
*pars
, uint32 plen
,
1875 char *source
, struct session
**sessionp
,
1876 struct rpcap_sampling
*samp_param _U_
, int uses_ssl
)
1878 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
1879 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
1880 char portdata
[PCAP_BUF_SIZE
]; // temp variable needed to derive the data port
1881 char peerhost
[PCAP_BUF_SIZE
]; // temp variable needed to derive the host name of our peer
1882 struct session
*session
= NULL
; // saves state of session
1884 char sendbuf
[RPCAP_NETBUF_SIZE
]; // temporary buffer in which data to be sent is buffered
1885 int sendbufidx
= 0; // index which keeps the number of bytes currently buffered
1887 // socket-related variables
1888 struct addrinfo hints
; // temp, needed to open a socket connection
1889 struct addrinfo
*addrinfo
; // temp, needed to open a socket connection
1890 struct sockaddr_storage saddr
; // temp, needed to retrieve the network data port chosen on the local machine
1891 socklen_t saddrlen
; // temp, needed to retrieve the network data port chosen on the local machine
1892 int ret
; // return value from functions
1894 // RPCAP-related variables
1895 struct rpcap_startcapreq startcapreq
; // start capture request message
1896 struct rpcap_startcapreply
*startcapreply
; // start capture reply message
1897 int serveropen_dp
; // keeps who is going to open the data connection
1901 status
= rpcapd_recv(pars
->sockctrl
, pars
->ssl
, (char *) &startcapreq
,
1902 sizeof(struct rpcap_startcapreq
), &plen
, errmsgbuf
);
1912 startcapreq
.flags
= ntohs(startcapreq
.flags
);
1914 // Check that the client does not ask for UDP is the server has been asked
1915 // to enforce encryption, as SSL is not supported yet with UDP:
1916 if (uses_ssl
&& (startcapreq
.flags
& RPCAP_STARTCAPREQ_FLAG_DGRAM
))
1918 snprintf(errbuf
, PCAP_ERRBUF_SIZE
,
1919 "SSL not supported with UDP forward of remote packets");
1923 // Create a session structure
1924 session
= malloc(sizeof(struct session
));
1925 if (session
== NULL
)
1927 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Can't allocate session structure");
1931 session
->sockdata
= INVALID_SOCKET
;
1932 session
->ctrl_ssl
= session
->data_ssl
= NULL
;
1933 // We don't have a thread yet.
1934 session
->have_thread
= 0;
1936 // We *shouldn't* have to initialize the thread indicator
1937 // itself, because the compiler *should* realize that we
1938 // only use this if have_thread isn't 0, but we *do* have
1939 // to do it, because not all compilers *do* realize that.
1941 // There is no "invalid thread handle" value for a UN*X
1942 // pthread_t, so we just zero it out.
1945 session
->thread
= INVALID_HANDLE_VALUE
;
1947 memset(&session
->thread
, 0, sizeof(session
->thread
));
1950 // Open the selected device
1951 if ((session
->fp
= pcap_open_live(source
,
1952 ntohl(startcapreq
.snaplen
),
1953 (startcapreq
.flags
& RPCAP_STARTCAPREQ_FLAG_PROMISC
) ? 1 : 0 /* local device, other flags not needed */,
1954 ntohl(startcapreq
.read_timeout
),
1955 errmsgbuf
)) == NULL
)
1959 // Apply sampling parameters
1960 fp
->rmt_samp
.method
= samp_param
->method
;
1961 fp
->rmt_samp
.value
= samp_param
->value
;
1965 We're in active mode if:
1966 - we're using TCP, and the user wants us to be in active mode
1969 serveropen_dp
= (startcapreq
.flags
& RPCAP_STARTCAPREQ_FLAG_SERVEROPEN
) || (startcapreq
.flags
& RPCAP_STARTCAPREQ_FLAG_DGRAM
) || pars
->isactive
;
1972 Gets the sockaddr structure referred to the other peer in the ctrl connection
1974 We need that because:
1975 - if we're in passive mode, we need to know the address family we want to use
1976 (the same used for the ctrl socket)
1977 - if we're in active mode, we need to know the network address of the other host
1978 we want to connect to
1980 saddrlen
= sizeof(struct sockaddr_storage
);
1981 if (getpeername(pars
->sockctrl
, (struct sockaddr
*) &saddr
, &saddrlen
) == -1)
1983 sock_geterror("getpeername()", errmsgbuf
, PCAP_ERRBUF_SIZE
);
1987 memset(&hints
, 0, sizeof(struct addrinfo
));
1988 hints
.ai_socktype
= (startcapreq
.flags
& RPCAP_STARTCAPREQ_FLAG_DGRAM
) ? SOCK_DGRAM
: SOCK_STREAM
;
1989 hints
.ai_family
= saddr
.ss_family
;
1991 // Now we have to create a new socket to send packets
1992 if (serveropen_dp
) // Data connection is opened by the server toward the client
1994 snprintf(portdata
, sizeof portdata
, "%d", ntohs(startcapreq
.portdata
));
1996 // Get the name of the other peer (needed to connect to that specific network address)
1997 if (getnameinfo((struct sockaddr
*) &saddr
, saddrlen
, peerhost
,
1998 sizeof(peerhost
), NULL
, 0, NI_NUMERICHOST
))
2000 sock_geterror("getnameinfo()", errmsgbuf
, PCAP_ERRBUF_SIZE
);
2004 if (sock_initaddress(peerhost
, portdata
, &hints
, &addrinfo
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2007 if ((session
->sockdata
= sock_open(addrinfo
, SOCKOPEN_CLIENT
, 0, errmsgbuf
, PCAP_ERRBUF_SIZE
)) == INVALID_SOCKET
)
2010 else // Data connection is opened by the client toward the server
2012 hints
.ai_flags
= AI_PASSIVE
;
2014 // Let's the server socket pick up a free network port for us
2015 if (sock_initaddress(NULL
, "0", &hints
, &addrinfo
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2018 if ((session
->sockdata
= sock_open(addrinfo
, SOCKOPEN_SERVER
, 1 /* max 1 connection in queue */, errmsgbuf
, PCAP_ERRBUF_SIZE
)) == INVALID_SOCKET
)
2021 // get the complete sockaddr structure used in the data connection
2022 saddrlen
= sizeof(struct sockaddr_storage
);
2023 if (getsockname(session
->sockdata
, (struct sockaddr
*) &saddr
, &saddrlen
) == -1)
2025 sock_geterror("getsockname()", errmsgbuf
, PCAP_ERRBUF_SIZE
);
2029 // Get the local port the system picked up
2030 if (getnameinfo((struct sockaddr
*) &saddr
, saddrlen
, NULL
,
2031 0, portdata
, sizeof(portdata
), NI_NUMERICSERV
))
2033 sock_geterror("getnameinfo()", errmsgbuf
, PCAP_ERRBUF_SIZE
);
2038 // addrinfo is no longer used
2039 freeaddrinfo(addrinfo
);
2042 // Needed to send an error on the ctrl connection
2043 session
->sockctrl
= pars
->sockctrl
;
2044 session
->ctrl_ssl
= pars
->ssl
;
2045 session
->protocol_version
= ver
;
2047 // Now I can set the filter
2048 ret
= daemon_unpackapplyfilter(pars
->sockctrl
, pars
->ssl
, session
, &plen
, errmsgbuf
);
2051 // Fatal error. A message has been logged; just give up.
2056 // Non-fatal error. Send an error message to the client.
2060 // Now, I can send a RPCAP start capture reply message
2061 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
, &sendbufidx
,
2062 RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2065 rpcap_createhdr((struct rpcap_header
*) sendbuf
, ver
,
2066 RPCAP_MSG_STARTCAP_REPLY
, 0, sizeof(struct rpcap_startcapreply
));
2068 startcapreply
= (struct rpcap_startcapreply
*) &sendbuf
[sendbufidx
];
2070 if (sock_bufferize(NULL
, sizeof(struct rpcap_startcapreply
), NULL
,
2071 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2074 memset(startcapreply
, 0, sizeof(struct rpcap_startcapreply
));
2075 startcapreply
->bufsize
= htonl(pcap_bufsize(session
->fp
));
2079 unsigned short port
= (unsigned short)strtoul(portdata
,NULL
,10);
2080 startcapreply
->portdata
= htons(port
);
2083 if (sock_send(pars
->sockctrl
, pars
->ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2085 // That failed; log a message and give up.
2086 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2092 SOCKET socktemp
; // We need another socket, since we're going to accept() a connection
2094 // Connection creation
2095 saddrlen
= sizeof(struct sockaddr_storage
);
2097 socktemp
= accept(session
->sockdata
, (struct sockaddr
*) &saddr
, &saddrlen
);
2099 if (socktemp
== INVALID_SOCKET
)
2101 sock_geterror("accept()", errbuf
, PCAP_ERRBUF_SIZE
);
2102 rpcapd_log(LOGPRIO_ERROR
, "Accept of data connection failed: %s",
2107 // Now that I accepted the connection, the server socket is no longer needed
2108 sock_close(session
->sockdata
, NULL
, 0);
2109 session
->sockdata
= socktemp
;
2116 /* In both active or passive cases, wait for the client to initiate the
2117 * TLS handshake. Yes during that time the control socket will not be
2118 * served, but the same was true from the above call to accept(). */
2119 ssl
= ssl_promotion(1, session
->sockdata
, errbuf
, PCAP_ERRBUF_SIZE
);
2122 rpcapd_log(LOGPRIO_ERROR
, "TLS handshake failed: %s", errbuf
);
2127 session
->data_ssl
= ssl
;
2129 // Now we have to create a new thread to receive packets
2131 session
->thread
= (HANDLE
)_beginthreadex(NULL
, 0, daemon_thrdatamain
,
2132 (void *) session
, 0, NULL
);
2133 if (session
->thread
== 0)
2135 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Error creating the data thread");
2139 ret
= pthread_create(&session
->thread
, NULL
, daemon_thrdatamain
,
2143 pcap_fmt_errmsg_for_errno(errbuf
, PCAP_ERRBUF_SIZE
,
2144 ret
, "Error creating the data thread");
2148 session
->have_thread
= 1;
2150 // Check if all the data has been read; if not, discard the data in excess
2151 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2154 *sessionp
= session
;
2159 // Not a fatal error, so send the client an error message and
2160 // keep serving client requests.
2165 freeaddrinfo(addrinfo
);
2169 session_close(session
);
2173 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
,
2174 PCAP_ERR_STARTCAPTURE
, errmsgbuf
, errbuf
) == -1)
2176 // That failed; log a message and give up.
2177 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2181 // Check if all the data has been read; if not, discard the data in excess
2182 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2192 // Fatal network error, so don't try to communicate with
2193 // the client, just give up.
2199 session_close(session
);
2207 daemon_msg_endcap_req(uint8 ver
, struct daemon_slpars
*pars
,
2208 struct session
*session
)
2210 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
2211 struct rpcap_header header
;
2213 session_close(session
);
2215 rpcap_createhdr(&header
, ver
, RPCAP_MSG_ENDCAP_REPLY
, 0, 0);
2217 if (sock_send(pars
->sockctrl
, pars
->ssl
, (char *) &header
, sizeof(struct rpcap_header
), errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2219 // That failed; log a message and give up.
2220 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2228 // We impose a limit on the filter program size, so that, on Windows,
2229 // where there's only one server process with multiple threads, it's
2230 // harder to eat all the server address space by sending larger filter
2231 // programs. (This isn't an issue on UN*X, where there are multiple
2232 // server processes, one per client connection.)
2234 // We pick a value that limits each filter to 64K; that value is twice
2235 // the in-kernel limit for Linux and 16 times the in-kernel limit for
2238 // It also prevents an overflow on 32-bit platforms when calculating
2239 // the total size of the filter program. (It's not an issue on 64-bit
2240 // platforms with a 64-bit size_t, as the filter size is 32 bits.)
2242 #define RPCAP_BPF_MAXINSNS 8192
2245 daemon_unpackapplyfilter(SOCKET sockctrl
, SSL
*ctrl_ssl
, struct session
*session
, uint32
*plenp
, char *errmsgbuf
)
2248 struct rpcap_filter filter
;
2249 struct rpcap_filterbpf_insn insn
;
2250 struct bpf_insn
*bf_insn
;
2251 struct bpf_program bf_prog
;
2254 status
= rpcapd_recv(sockctrl
, ctrl_ssl
, (char *) &filter
,
2255 sizeof(struct rpcap_filter
), plenp
, errmsgbuf
);
2265 bf_prog
.bf_len
= ntohl(filter
.nitems
);
2267 if (ntohs(filter
.filtertype
) != RPCAP_UPDATEFILTER_BPF
)
2269 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Only BPF/NPF filters are currently supported");
2273 if (bf_prog
.bf_len
> RPCAP_BPF_MAXINSNS
)
2275 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
,
2276 "Filter program is larger than the maximum size of %u instructions",
2277 RPCAP_BPF_MAXINSNS
);
2280 bf_insn
= (struct bpf_insn
*) malloc (sizeof(struct bpf_insn
) * bf_prog
.bf_len
);
2281 if (bf_insn
== NULL
)
2283 pcap_fmt_errmsg_for_errno(errmsgbuf
, PCAP_ERRBUF_SIZE
,
2284 errno
, "malloc() failed");
2288 bf_prog
.bf_insns
= bf_insn
;
2290 for (i
= 0; i
< bf_prog
.bf_len
; i
++)
2292 status
= rpcapd_recv(sockctrl
, ctrl_ssl
, (char *) &insn
,
2293 sizeof(struct rpcap_filterbpf_insn
), plenp
, errmsgbuf
);
2303 bf_insn
->code
= ntohs(insn
.code
);
2304 bf_insn
->jf
= insn
.jf
;
2305 bf_insn
->jt
= insn
.jt
;
2306 bf_insn
->k
= ntohl(insn
.k
);
2312 // XXX - pcap_setfilter() should do the validation for us.
2314 if (bpf_validate(bf_prog
.bf_insns
, bf_prog
.bf_len
) == 0)
2316 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "The filter contains bogus instructions");
2320 if (pcap_setfilter(session
->fp
, &bf_prog
))
2322 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "RPCAP error: %s", pcap_geterr(session
->fp
));
2330 daemon_msg_updatefilter_req(uint8 ver
, struct daemon_slpars
*pars
,
2331 struct session
*session
, uint32 plen
)
2333 char errbuf
[PCAP_ERRBUF_SIZE
];
2334 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
2335 int ret
; // status of daemon_unpackapplyfilter()
2336 struct rpcap_header header
; // keeps the answer to the updatefilter command
2338 ret
= daemon_unpackapplyfilter(pars
->sockctrl
, pars
->ssl
, session
, &plen
, errmsgbuf
);
2341 // Fatal error. A message has been logged; just give up.
2346 // Non-fatal error. Send an error reply to the client.
2350 // Check if all the data has been read; if not, discard the data in excess
2351 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2357 // A response is needed, otherwise the other host does not know that everything went well
2358 rpcap_createhdr(&header
, ver
, RPCAP_MSG_UPDATEFILTER_REPLY
, 0, 0);
2360 if (sock_send(pars
->sockctrl
, pars
->ssl
, (char *) &header
, sizeof (struct rpcap_header
), pcap_geterr(session
->fp
), PCAP_ERRBUF_SIZE
))
2362 // That failed; log a messsage and give up.
2363 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2370 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2374 rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
, PCAP_ERR_UPDATEFILTER
,
2381 \brief Received the sampling parameters from remote host and it stores in the pcap_t structure.
2384 daemon_msg_setsampling_req(uint8 ver
, struct daemon_slpars
*pars
, uint32 plen
,
2385 struct rpcap_sampling
*samp_param
)
2387 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
2388 char errmsgbuf
[PCAP_ERRBUF_SIZE
];
2389 struct rpcap_header header
;
2390 struct rpcap_sampling rpcap_samp
;
2393 status
= rpcapd_recv(pars
->sockctrl
, pars
->ssl
, (char *) &rpcap_samp
, sizeof(struct rpcap_sampling
), &plen
, errmsgbuf
);
2403 // Save these settings in the pcap_t
2404 samp_param
->method
= rpcap_samp
.method
;
2405 samp_param
->value
= ntohl(rpcap_samp
.value
);
2407 // A response is needed, otherwise the other host does not know that everything went well
2408 rpcap_createhdr(&header
, ver
, RPCAP_MSG_SETSAMPLING_REPLY
, 0, 0);
2410 if (sock_send(pars
->sockctrl
, pars
->ssl
, (char *) &header
, sizeof (struct rpcap_header
), errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2412 // That failed; log a messsage and give up.
2413 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2417 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2425 if (rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
, PCAP_ERR_SETSAMPLING
,
2426 errmsgbuf
, errbuf
) == -1)
2428 // That failed; log a message and give up.
2429 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2433 // Check if all the data has been read; if not, discard the data in excess
2434 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2443 daemon_msg_stats_req(uint8 ver
, struct daemon_slpars
*pars
,
2444 struct session
*session
, uint32 plen
, struct pcap_stat
*stats
,
2445 unsigned int svrcapt
)
2447 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
2448 char errmsgbuf
[PCAP_ERRBUF_SIZE
]; // buffer for errors to send to the client
2449 char sendbuf
[RPCAP_NETBUF_SIZE
]; // temporary buffer in which data to be sent is buffered
2450 int sendbufidx
= 0; // index which keeps the number of bytes currently buffered
2451 struct rpcap_stats
*netstats
; // statistics sent on the network
2453 // Checks that the header does not contain other data; if so, discard it
2454 if (rpcapd_discard(pars
->sockctrl
, pars
->ssl
, plen
) == -1)
2460 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
,
2461 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2464 rpcap_createhdr((struct rpcap_header
*) sendbuf
, ver
,
2465 RPCAP_MSG_STATS_REPLY
, 0, (uint16
) sizeof(struct rpcap_stats
));
2467 netstats
= (struct rpcap_stats
*) &sendbuf
[sendbufidx
];
2469 if (sock_bufferize(NULL
, sizeof(struct rpcap_stats
), NULL
,
2470 &sendbufidx
, RPCAP_NETBUF_SIZE
, SOCKBUF_CHECKONLY
, errmsgbuf
, PCAP_ERRBUF_SIZE
) == -1)
2473 if (session
&& session
->fp
)
2475 if (pcap_stats(session
->fp
, stats
) == -1)
2477 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "%s", pcap_geterr(session
->fp
));
2481 netstats
->ifdrop
= htonl(stats
->ps_ifdrop
);
2482 netstats
->ifrecv
= htonl(stats
->ps_recv
);
2483 netstats
->krnldrop
= htonl(stats
->ps_drop
);
2484 netstats
->svrcapt
= htonl(session
->TotCapt
);
2488 // We have to keep compatibility with old applications,
2489 // which ask for statistics also when the capture has
2491 netstats
->ifdrop
= htonl(stats
->ps_ifdrop
);
2492 netstats
->ifrecv
= htonl(stats
->ps_recv
);
2493 netstats
->krnldrop
= htonl(stats
->ps_drop
);
2494 netstats
->svrcapt
= htonl(svrcapt
);
2498 if (sock_send(pars
->sockctrl
, pars
->ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2500 rpcapd_log(LOGPRIO_ERROR
, "Send to client failed: %s", errbuf
);
2507 rpcap_senderror(pars
->sockctrl
, pars
->ssl
, ver
, PCAP_ERR_GETSTATS
,
2513 static unsigned __stdcall
2517 daemon_thrdatamain(void *ptr
)
2519 char errbuf
[PCAP_ERRBUF_SIZE
+ 1]; // error buffer
2520 struct session
*session
; // pointer to the struct session for this session
2521 int retval
; // general variable used to keep the return value of other functions
2522 struct rpcap_pkthdr
*net_pkt_header
;// header of the packet
2523 struct pcap_pkthdr
*pkt_header
; // pointer to the buffer that contains the header of the current packet
2524 u_char
*pkt_data
; // pointer to the buffer that contains the current packet
2525 size_t sendbufsize
; // size for the send buffer
2526 char *sendbuf
; // temporary buffer in which data to be sent is buffered
2527 int sendbufidx
; // index which keeps the number of bytes currently buffered
2530 sigset_t sigusr1
; // signal set with just SIGUSR1
2533 session
= (struct session
*) ptr
;
2535 session
->TotCapt
= 0; // counter which is incremented each time a packet is received
2537 // Initialize errbuf
2538 memset(errbuf
, 0, sizeof(errbuf
));
2541 // We need a buffer large enough to hold a buffer large enough
2542 // for a maximum-size packet for this pcap_t.
2544 if (pcap_snapshot(session
->fp
) < 0)
2547 // The snapshot length is negative.
2548 // This "should not happen".
2550 rpcapd_log(LOGPRIO_ERROR
,
2551 "Unable to allocate the buffer for this child thread: snapshot length of %d is negative",
2552 pcap_snapshot(session
->fp
));
2553 sendbuf
= NULL
; // we can't allocate a buffer, so nothing to free
2557 // size_t is unsigned, and the result of pcap_snapshot() is signed;
2558 // on no platform that we support is int larger than size_t.
2559 // This means that, unless the extra information we prepend to
2560 // a maximum-sized packet is impossibly large, the sum of the
2561 // snapshot length and the size of that extra information will
2564 // So we don't need to make sure that sendbufsize will overflow.
2566 // However, we *do* need to make sure its value fits in an int,
2567 // because sock_send() can't send more than INT_MAX bytes (it could
2568 // do so on 64-bit UN*Xes, but can't do so on Windows, not even
2569 // 64-bit Windows, as the send() buffer size argument is an int
2572 sendbufsize
= sizeof(struct rpcap_header
) + sizeof(struct rpcap_pkthdr
) + pcap_snapshot(session
->fp
);
2573 if (sendbufsize
> INT_MAX
)
2575 rpcapd_log(LOGPRIO_ERROR
,
2576 "Buffer size for this child thread would be larger than %d",
2578 sendbuf
= NULL
; // we haven't allocated a buffer, so nothing to free
2581 sendbuf
= (char *) malloc (sendbufsize
);
2582 if (sendbuf
== NULL
)
2584 rpcapd_log(LOGPRIO_ERROR
,
2585 "Unable to allocate the buffer for this child thread");
2591 // Set the signal set to include just SIGUSR1, and block that
2592 // signal; we only want it unblocked when we're reading
2593 // packets - we dn't want any other system calls, such as
2594 // ones being used to send to the client or to log messages,
2595 // to be interrupted.
2597 sigemptyset(&sigusr1
);
2598 sigaddset(&sigusr1
, SIGUSR1
);
2599 pthread_sigmask(SIG_BLOCK
, &sigusr1
, NULL
);
2602 // Retrieve the packets
2607 // Unblock SIGUSR1 while we might be waiting for packets.
2609 pthread_sigmask(SIG_UNBLOCK
, &sigusr1
, NULL
);
2611 retval
= pcap_next_ex(session
->fp
, &pkt_header
, (const u_char
**) &pkt_data
); // cast to avoid a compiler warning
2614 // Now block it again.
2616 pthread_sigmask(SIG_BLOCK
, &sigusr1
, NULL
);
2620 if (retval
== 0) // Read timeout elapsed
2625 // Bufferize the general header
2626 if (sock_bufferize(NULL
, sizeof(struct rpcap_header
), NULL
,
2627 &sendbufidx
, (int)sendbufsize
, SOCKBUF_CHECKONLY
, errbuf
,
2628 PCAP_ERRBUF_SIZE
) == -1)
2630 rpcapd_log(LOGPRIO_ERROR
,
2631 "sock_bufferize() error sending packet message: %s",
2636 rpcap_createhdr((struct rpcap_header
*) sendbuf
,
2637 session
->protocol_version
, RPCAP_MSG_PACKET
, 0,
2638 (uint16
) (sizeof(struct rpcap_pkthdr
) + pkt_header
->caplen
));
2640 net_pkt_header
= (struct rpcap_pkthdr
*) &sendbuf
[sendbufidx
];
2642 // Bufferize the pkt header
2643 if (sock_bufferize(NULL
, sizeof(struct rpcap_pkthdr
), NULL
,
2644 &sendbufidx
, (int)sendbufsize
, SOCKBUF_CHECKONLY
, errbuf
,
2645 PCAP_ERRBUF_SIZE
) == -1)
2647 rpcapd_log(LOGPRIO_ERROR
,
2648 "sock_bufferize() error sending packet message: %s",
2653 net_pkt_header
->caplen
= htonl(pkt_header
->caplen
);
2654 net_pkt_header
->len
= htonl(pkt_header
->len
);
2655 net_pkt_header
->npkt
= htonl(++(session
->TotCapt
));
2657 // This protocol needs to be updated with a new version
2658 // before 2038-01-19 03:14:07 UTC.
2660 net_pkt_header
->timestamp_sec
= htonl((uint32
)pkt_header
->ts
.tv_sec
);
2661 net_pkt_header
->timestamp_usec
= htonl((uint32
)pkt_header
->ts
.tv_usec
);
2663 // Bufferize the pkt data
2664 if (sock_bufferize((char *) pkt_data
, pkt_header
->caplen
,
2665 sendbuf
, &sendbufidx
, (int)sendbufsize
, SOCKBUF_BUFFERIZE
,
2666 errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2668 rpcapd_log(LOGPRIO_ERROR
,
2669 "sock_bufferize() error sending packet message: %s",
2675 // If the client dropped the connection, don't report an
2676 // error, just quit.
2677 status
= sock_send(session
->sockdata
, session
->data_ssl
, sendbuf
, sendbufidx
, errbuf
, PCAP_ERRBUF_SIZE
);
2683 // Error other than "client closed the
2684 // connection out from under us"; report
2687 rpcapd_log(LOGPRIO_ERROR
,
2688 "Send of packet to client failed: %s",
2693 // Give up in either case.
2699 if (retval
< 0 && retval
!= PCAP_ERROR_BREAK
)
2702 // Failed with an error other than "we were told to break
2703 // out of the loop".
2705 // The latter just means that the client told us to stop
2706 // capturing, so there's no error to report.
2708 snprintf(errbuf
, PCAP_ERRBUF_SIZE
, "Error reading the packets: %s", pcap_geterr(session
->fp
));
2709 rpcap_senderror(session
->sockctrl
, session
->ctrl_ssl
, session
->protocol_version
,
2710 PCAP_ERR_READEX
, errbuf
, NULL
);
2715 // The main thread will clean up the session structure.
2724 // Do-nothing handler for SIGUSR1; the sole purpose of SIGUSR1 is to
2725 // interrupt the data thread if it's blocked in a system call waiting
2726 // for packets to arrive.
2728 static void noop_handler(int sign _U_
)
2734 \brief It serializes a network address.
2736 It accepts a 'sockaddr_storage' structure as input, and it converts it appropriately into a format
2737 that can be used to be sent on the network. Basically, it applies all the hton()
2738 conversion required to the input variable.
2740 \param sockaddrin a 'sockaddr_storage' pointer to the variable that has to be
2741 serialized. This variable can be both a 'sockaddr_in' and 'sockaddr_in6'.
2743 \param sockaddrout an 'rpcap_sockaddr' pointer to the variable that will contain
2744 the serialized data. This variable has to be allocated by the user.
2746 \warning This function supports only AF_INET and AF_INET6 address families.
2749 daemon_seraddr(struct sockaddr_storage
*sockaddrin
, struct rpcap_sockaddr
*sockaddrout
)
2751 memset(sockaddrout
, 0, sizeof(struct sockaddr_storage
));
2753 // There can be the case in which the sockaddrin is not available
2754 if (sockaddrin
== NULL
) return;
2756 // Warning: we support only AF_INET and AF_INET6
2757 switch (sockaddrin
->ss_family
)
2761 struct sockaddr_in
*sockaddrin_ipv4
;
2762 struct rpcap_sockaddr_in
*sockaddrout_ipv4
;
2764 sockaddrin_ipv4
= (struct sockaddr_in
*) sockaddrin
;
2765 sockaddrout_ipv4
= (struct rpcap_sockaddr_in
*) sockaddrout
;
2766 sockaddrout_ipv4
->family
= htons(RPCAP_AF_INET
);
2767 sockaddrout_ipv4
->port
= htons(sockaddrin_ipv4
->sin_port
);
2768 memcpy(&sockaddrout_ipv4
->addr
, &sockaddrin_ipv4
->sin_addr
, sizeof(sockaddrout_ipv4
->addr
));
2769 memset(sockaddrout_ipv4
->zero
, 0, sizeof(sockaddrout_ipv4
->zero
));
2776 struct sockaddr_in6
*sockaddrin_ipv6
;
2777 struct rpcap_sockaddr_in6
*sockaddrout_ipv6
;
2779 sockaddrin_ipv6
= (struct sockaddr_in6
*) sockaddrin
;
2780 sockaddrout_ipv6
= (struct rpcap_sockaddr_in6
*) sockaddrout
;
2781 sockaddrout_ipv6
->family
= htons(RPCAP_AF_INET6
);
2782 sockaddrout_ipv6
->port
= htons(sockaddrin_ipv6
->sin6_port
);
2783 sockaddrout_ipv6
->flowinfo
= htonl(sockaddrin_ipv6
->sin6_flowinfo
);
2784 memcpy(&sockaddrout_ipv6
->addr
, &sockaddrin_ipv6
->sin6_addr
, sizeof(sockaddrout_ipv6
->addr
));
2785 sockaddrout_ipv6
->scope_id
= htonl(sockaddrin_ipv6
->sin6_scope_id
);
2794 \brief Suspends a thread for secs seconds.
2796 void sleep_secs(int secs
)
2801 unsigned secs_remaining
;
2805 secs_remaining
= secs
;
2806 while (secs_remaining
!= 0)
2807 secs_remaining
= sleep(secs_remaining
);
2812 * Read the header of a message.
2815 rpcapd_recv_msg_header(SOCKET sock
, SSL
*ssl
, struct rpcap_header
*headerp
)
2818 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
2820 nread
= sock_recv(sock
, ssl
, (char *) headerp
, sizeof(struct rpcap_header
),
2821 SOCK_RECEIVEALL_YES
|SOCK_EOF_ISNT_ERROR
, errbuf
, PCAP_ERRBUF_SIZE
);
2825 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
2830 // Immediate EOF; that's treated like a close message.
2833 headerp
->plen
= ntohl(headerp
->plen
);
2838 * Read data from a message.
2839 * If we're trying to read more data that remains, puts an error
2840 * message into errmsgbuf and returns -2. Otherwise, tries to read
2841 * the data and, if that succeeds, subtracts the amount read from
2842 * the number of bytes of data that remains.
2843 * Returns 0 on success, logs a message and returns -1 on a network
2847 rpcapd_recv(SOCKET sock
, SSL
*ssl
, char *buffer
, size_t toread
, uint32
*plen
, char *errmsgbuf
)
2850 char errbuf
[PCAP_ERRBUF_SIZE
]; // buffer for network errors
2854 // Tell the client and continue.
2855 snprintf(errmsgbuf
, PCAP_ERRBUF_SIZE
, "Message payload is too short");
2858 nread
= sock_recv(sock
, ssl
, buffer
, toread
,
2859 SOCK_RECEIVEALL_YES
|SOCK_EOF_IS_ERROR
, errbuf
, PCAP_ERRBUF_SIZE
);
2862 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
2870 * Discard data from a connection.
2871 * Mostly used to discard wrong-sized messages.
2872 * Returns 0 on success, logs a message and returns -1 on a network
2876 rpcapd_discard(SOCKET sock
, SSL
*ssl
, uint32 len
)
2878 char errbuf
[PCAP_ERRBUF_SIZE
+ 1]; // keeps the error string, prior to be printed
2882 if (sock_discard(sock
, ssl
, len
, errbuf
, PCAP_ERRBUF_SIZE
) == -1)
2885 rpcapd_log(LOGPRIO_ERROR
, "Read from client failed: %s", errbuf
);
2893 // Shut down any packet-capture thread associated with the session,
2894 // close the SSL handle for the data socket if we have one, close
2895 // the data socket if we have one, and close the underlying packet
2896 // capture handle if we have one.
2898 // We do not, of course, touch the controlling socket that's also
2899 // copied into the session, as the service loop might still use it.
2901 static void session_close(struct session
*session
)
2903 if (session
->have_thread
)
2906 // Tell the data connection thread main capture loop to
2907 // break out of that loop.
2909 // This may be sufficient to wake up a blocked thread,
2910 // but it's not guaranteed to be sufficient.
2912 pcap_breakloop(session
->fp
);
2916 // Set the event on which a read would block, so that,
2917 // if it's currently blocked waiting for packets to
2918 // arrive, it'll wake up, so it can see the "break
2919 // out of the loop" indication. (pcap_breakloop()
2920 // might do this, but older versions don't. Setting
2921 // it twice should, at worst, cause an extra wakeup,
2922 // which shouldn't be a problem.)
2924 // XXX - what about modules other than NPF?
2926 SetEvent(pcap_getevent(session
->fp
));
2929 // Wait for the thread to exit, so we don't close
2930 // sockets out from under it.
2932 // XXX - have a timeout, so we don't wait forever?
2934 WaitForSingleObject(session
->thread
, INFINITE
);
2937 // Release the thread handle, as we're done with
2940 CloseHandle(session
->thread
);
2941 session
->have_thread
= 0;
2942 session
->thread
= INVALID_HANDLE_VALUE
;
2945 // Send a SIGUSR1 signal to the thread, so that, if
2946 // it's currently blocked waiting for packets to arrive,
2947 // it'll wake up (we've turned off SA_RESTART for
2948 // SIGUSR1, so that the system call in which it's blocked
2949 // should return EINTR rather than restarting).
2951 pthread_kill(session
->thread
, SIGUSR1
);
2954 // Wait for the thread to exit, so we don't close
2955 // sockets out from under it.
2957 // XXX - have a timeout, so we don't wait forever?
2959 pthread_join(session
->thread
, NULL
);
2960 session
->have_thread
= 0;
2961 memset(&session
->thread
, 0, sizeof(session
->thread
));
2966 if (session
->data_ssl
)
2968 // Finish using the SSL handle for the socket.
2969 // This must be done *before* the socket is closed.
2970 ssl_finish(session
->data_ssl
);
2971 session
->data_ssl
= NULL
;
2975 if (session
->sockdata
!= INVALID_SOCKET
)
2977 sock_close(session
->sockdata
, NULL
, 0);
2978 session
->sockdata
= INVALID_SOCKET
;
2983 pcap_close(session
->fp
);
2988 // Check whether a capture source string is a URL or not.
2989 // This includes URLs that refer to a local device; a scheme, followed
2990 // by ://, followed by *another* scheme and ://, is just silly, and
2991 // anybody who supplies that will get an error.
2994 is_url(const char *source
)
3001 * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
3003 * hier-part = "//" authority path-abempty
3008 * authority = [ userinfo "@" ] host [ ":" port ]
3010 * userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
3012 * Step 1: look for the ":" at the end of the scheme.
3013 * A colon in the source is *NOT* sufficient to indicate that
3014 * this is a URL, as interface names on some platforms might
3015 * include colons (e.g., I think some Solaris interfaces
3018 colonp
= strchr(source
, ':');
3022 * The source is the device to open. It's not a URL.
3028 * All schemes must have "//" after them, i.e. we only support
3029 * hier-part = "//" authority path-abempty, not
3030 * hier-part = path-absolute
3031 * hier-part = path-rootless
3032 * hier-part = path-empty
3034 * We need that in order to distinguish between a local device
3035 * name that happens to contain a colon and a URI.
3037 if (strncmp(colonp
+ 1, "//", 2) != 0)
3040 * The source is the device to open. It's not a URL.