]>
The Tcpdump Group git mirrors - libpcap/blob - pcap-linux.c
2 pcap-linux.c: Packet capture interface to the Linux kernel
3 Copyright (c) 2000 Torsten Landschoff <torsten@debian.org>
4 Sebastian Krahmer <krahmer@cs.uni-potsdam.de>
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions
12 1. Redistributions of source code must retain the above copyright
13 notice, this list of conditions and the following disclaimer.
14 2. Redistributions in binary form must reproduce the above copyright
15 notice, this list of conditions and the following disclaimer in
16 the documentation and/or other materials provided with the
18 3. The names of the authors may not be used to endorse or promote
19 products derived from this software without specific prior
22 THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
23 IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30 - Make it compatible with older Linux installations (at compilation time)
34 - setting promiscuous on loopback for example gives every packet
42 pcap_read currently reads not only a packet from the kernel but also
43 the sockaddr_ll returned as source of the packet. This way we can at
44 some time extend tcpdump and libpcap to sniff on all devices at a time
45 and find the right printing routine by using the information in the
46 sockaddr_ll structure.
57 #include <sys/socket.h>
58 #include <sys/ioctl.h>
60 #include <netinet/in.h>
61 #include <linux/if_ether.h>
62 #include <netinet/if_ether.h>
64 #ifdef HAVE_NETPACKET_PACKET_H
65 #include <netpacket/packet.h>
67 #ifdef SO_ATTACH_FILTER
68 #include <linux/types.h>
69 #include <linux/filter.h>
73 typedef int socklen_t
;
77 #define MAX_LINKHEADER_SIZE 256
79 /* Prototypes for internal functions */
80 static int map_arphrd_to_dlt( int arptype
);
81 static int live_open_old( pcap_t
*, char *, int, int, char * );
82 static int live_open_new( pcap_t
*, char *, int, int, char * );
83 static int pcap_read_packet( pcap_t
*, pcap_handler
, u_char
* );
85 /* Wrap some ioctl calls */
86 static int iface_get_id( int fd
, const char *device
, char *ebuf
);
87 static int iface_get_mtu( int fd
, const char *device
, char *ebuf
);
88 static int iface_get_arptype( int fd
, const char *device
, char *ebuf
);
89 static int iface_bind( int fd
, int ifindex
, char *ebuf
);
90 static int iface_bind_old( int fd
, const char *device
, char *ebuf
);
95 Get a handle for a live capture from the given device. You can
96 pass NULL as device to get all packages (without link level
97 information of course). If you pass 1 as promisc the interface
98 will be set to promiscous mode (XXX: I think this usage should
99 be deprecated and functions be added to select that later allow
100 modification of that values -- Torsten).
105 pcap_open_live( char *device
, int snaplen
, int promisc
, int to_ms
, char *ebuf
)
107 /* Allocate a handle for this session. */
109 pcap_t
*handle
= malloc(sizeof(*handle
));
110 if( handle
== NULL
) {
111 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "malloc: %s",
112 pcap_strerror(errno
));
116 /* Initialize some components of the pcap structure. */
118 memset( handle
, 0, sizeof(*handle
) );
119 handle
->snapshot
= snaplen
;
120 handle
->md
.timeout
= to_ms
;
121 handle
->md
.promisc
= promisc
;
122 handle
->md
.device
= strdup( device
);
123 if( handle
->md
.device
== NULL
) {
124 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "strdup: %s",
125 pcap_strerror(errno
) );
130 /* Current Linux kernels use the protocol family PF_PACKET to
131 * allow direct access to all packets on the network while
132 * older kernels had a special socket type SOCK_PACKET to
133 * implement this feature.
134 * While this old implementation is kind of obsolete we need
135 * to be compatible with older kernels for a while so we are
136 * trying both methods with the newer method preferred. */
138 if( ! (live_open_new(handle
, device
, promisc
, to_ms
, ebuf
) ||
139 live_open_old(handle
, device
, promisc
, to_ms
, ebuf
)) )
141 /* Both methods to open the packet socket failed. Tidy
142 * up and report our failure (ebuf is expected to be
143 * set by the functions above). */
145 free(handle
->md
.device
);
150 /* Okay, now we have a packet stream open. Maybe we need to handle
151 * a timeout? In that case we set the filehandle to nonblocking
152 * so pcap_read can try reading the fd and call select if no data
153 * is available at once. */
156 int flags
= fcntl( handle
->fd
, F_GETFL
);
159 flags
= fcntl( handle
->fd
, F_SETFL
, flags
);
162 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "fcntl: %s",
163 pcap_strerror(errno
));
164 pcap_close( handle
);
175 Read at most max_packets from the capture stream and
176 call the callback for each of them. Returns the number
177 of packets handled or -1 if an error occured.
179 XXX: Can I rely on the Linux-specified behaviour of select
180 (returning the time left in the timeval structure)? I really
181 don't want to query the system time before each select call...
184 pcap_read(pcap_t
*handle
, int max_packets
, pcap_handler callback
, u_char
*user
)
190 if( handle
->md
.timeout
> 0 ) {
191 tv
.tv_usec
= (handle
->md
.timeout
% 1000) * 1000;
192 tv
.tv_sec
= (handle
->md
.timeout
/ 1000);
195 for( packets
= 0; max_packets
== -1 || packets
< max_packets
; )
197 status
= pcap_read_packet( handle
, callback
, user
);
202 } else if( status
== -1 )
205 /* paranoia - the recvmsg call should block if we don't use
207 if( handle
->md
.timeout
<= 0 )
210 /* No packet available - go to sleep */
211 FD_ZERO( &read_fds
);
212 FD_SET( handle
->fd
, &read_fds
);
213 status
= select( handle
->fd
+ 1,
214 &read_fds
, NULL
, NULL
, &tv
);
216 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
217 "select: %s", pcap_strerror(errno
));
219 } else if( status
== 0 ||
220 (tv
.tv_usec
== 0 && tv
.tv_sec
== 0) )
230 Read a packet from the socket calling the handler provided by
231 the user. Returns 0 if no packet was there, 1 if a packet was
232 handled and -1 if an error occured.
235 pcap_read_packet( pcap_t
*handle
, pcap_handler callback
, u_char
*userdata
)
237 struct sockaddr from
;
239 int packet_len
, caplen
;
240 struct pcap_pkthdr pcap_header
;
242 /* We don't currently use the from return value of recvfrom but
243 * this will probably implemented in the future. */
245 /* Receive a single packet from the kernel */
247 fromlen
= sizeof(from
);
248 packet_len
= recvfrom(
249 handle
->fd
, handle
->buffer
+ handle
->offset
,
250 handle
->snapshot
, MSG_TRUNC
,
251 (struct sockaddr
*) &from
, &fromlen
);
252 } while( packet_len
== -1 && errno
== EINTR
);
254 /* Check if some error occured */
255 if( packet_len
== -1 ) {
256 if( errno
== EAGAIN
)
257 return 0; /* no packet there */
259 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
260 "recvfrom: %s", pcap_strerror(errno
));
265 /* XXX: According to the kernel source we should get the real
266 * packet len if calling recvfrom with MSG_TRUNC set. It does
267 * not seem to work here :(, but it is supported by this code
271 if( caplen
> handle
->snapshot
)
272 caplen
= handle
->snapshot
;
274 /* Run the packet filter if not using kernel filter */
275 if( !handle
->md
.use_bpf
&& handle
->fcode
.bf_insns
) {
276 if( bpf_filter(handle
->fcode
.bf_insns
, handle
->buffer
,
277 packet_len
, caplen
) == 0 )
279 /* rejected by filter */
284 /* Fill in our own header data */
286 if( ioctl(handle
->fd
, SIOCGSTAMP
, &pcap_header
.ts
) == -1 ) {
287 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
288 "ioctl: %s", pcap_strerror(errno
));
291 pcap_header
.caplen
= caplen
;
292 pcap_header
.len
= packet_len
;
294 /* Call the user supplied callback function */
295 handle
->md
.stat
.ps_recv
++;
296 callback( userdata
, &pcap_header
, handle
->buffer
+ handle
->offset
);
304 Get the statistics for the given packet capture handle.
307 pcap_stats( pcap_t
*handle
, struct pcap_stat
*stats
)
309 *stats
= handle
->md
.stat
;
316 Attach the given BPF code to the packet capture device.
319 pcap_setfilter( pcap_t
*handle
, struct bpf_program
*filter
)
321 #ifdef SO_ATTACH_FILTER
322 struct sock_fprog fcode
;
328 strncpy(handle
->errbuf
, "setfilter: No filter specified",
329 sizeof(handle
->errbuf
));
333 /* Free old filter code if existing */
334 handle
->fcode
.bf_len
= 0;
335 if( handle
->fcode
.bf_insns
) {
336 free( handle
->fcode
.bf_insns
);
337 handle
->fcode
.bf_insns
= NULL
;
341 /* Make our private copy of the filter */
342 handle
->fcode
.bf_len
= filter
->bf_len
;
343 handle
->fcode
.bf_insns
=
344 malloc( filter
->bf_len
* sizeof(*filter
->bf_insns
) );
345 if( handle
->fcode
.bf_insns
== NULL
) {
346 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
347 "malloc: %s", pcap_strerror(errno
));
350 memcpy( handle
->fcode
.bf_insns
, filter
->bf_insns
,
351 filter
->bf_len
* sizeof(*filter
->bf_insns
) );
353 /* Run user level packet filter by default. Will be overriden if
354 * installing a kernel filter succeeds. */
355 handle
->md
.use_bpf
= 0;
357 /* Install kernel level filter if possible */
359 #ifdef SO_ATTACH_FILTER
360 /* Oh joy, the Linux kernel uses struct sock_fprog instead of
361 * struct bpf_program and of course the length field is of
362 * different size. Pointed out by Sebastian */
364 fcode
.filter
= (struct sock_filter
*) handle
->fcode
.bf_insns
;
365 fcode
.len
= filter
->bf_len
;
366 if( filter
->bf_len
> USHRT_MAX
) {
367 fprintf( stderr
, "Warning: Filter to complex for kernel\n" );
368 /* paranoid - should never happen */
370 else if( setsockopt(handle
->fd
, SOL_SOCKET
, SO_ATTACH_FILTER
,
371 &fcode
, sizeof(fcode
)) == 0 )
373 handle
->md
.use_bpf
= 1;
376 /* Print a warning if kernel filter available but a problem
377 * occured using it. */
378 if( errno
!= ENOPROTOOPT
&& errno
!= EOPNOTSUPP
) {
379 fprintf( stderr
, "Warning: Kernel filter failed: %s\n",
380 pcap_strerror(errno
) );
392 Linux uses the ARP hardware type to identify the type of an
393 interface. pcap uses the DLT_xxx constants for this. This
394 function maps the ARPHRD_xxx constant to an appropriate
397 Returns -1 if unable to map the type.
399 static int map_arphrd_to_dlt( int arptype
)
403 case ARPHRD_METRICOM
:
404 case ARPHRD_LOOPBACK
: return DLT_EN10MB
;
405 case ARPHRD_EETHER
: return DLT_EN3MB
;
406 case ARPHRD_AX25
: return DLT_AX25
;
407 case ARPHRD_PRONET
: return DLT_PRONET
;
408 case ARPHRD_CHAOS
: return DLT_CHAOS
;
409 case ARPHRD_IEEE802
: return DLT_IEEE802
;
410 case ARPHRD_ARCNET
: return DLT_ARCNET
;
411 case ARPHRD_FDDI
: return DLT_FDDI
;
417 case ARPHRD_SLIP
: return DLT_RAW
;
423 /* ===== Functions to interface to the newer kernels ================== */
428 Try to open a packet socket using the new kernel interface.
429 Returns 0 on failure.
430 FIXME: 0 uses to mean success (Sebastian)
433 live_open_new( pcap_t
*handle
, char *device
, int promisc
,
434 int to_ms
, char *ebuf
)
436 #ifdef HAVE_NETPACKET_PACKET_H
437 int sock_fd
= -1, device_id
, mtu
, arptype
;
438 struct packet_mreq mr
;
440 /* One shot loop used for error handling - bail out with break */
444 /* Open a socket with protocol family packet. */
445 sock_fd
= socket( PF_PACKET
, SOCK_RAW
, htons(ETH_P_ALL
) );
446 if( sock_fd
== -1 ) {
447 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "socket: %s",
448 pcap_strerror(errno
) );
452 /* It seems the kernel supports the new interface. */
453 handle
->md
.sock_packet
= 0;
455 /* Currently we only support monitoring a single interface.
456 * While the kernel can do more I want to reimplement the
457 * old features first before adding more. */
460 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
461 "pcap_open_live: No device given" );
465 /* What kind of frames do we have to deal with? Fall back
466 * to cooked mode if we have an unknown interface type. */
468 arptype
= iface_get_arptype(sock_fd
, device
, ebuf
);
471 handle
->linktype
= map_arphrd_to_dlt( arptype
);
472 if( handle
->linktype
== -1 ) {
473 /* Unknown interface type - reopen in cooked mode */
475 if( close(sock_fd
) == -1 ) {
476 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
477 "close: %s", pcap_strerror(errno
));
480 sock_fd
= socket( PF_PACKET
, SOCK_DGRAM
,
482 if( sock_fd
== -1 ) {
483 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
484 "socket: %s", pcap_strerror(errno
));
489 "Warning: Falling back to cooked socket\n" );
490 handle
->linktype
= DLT_RAW
;
494 device_id
= iface_get_id( sock_fd
, device
, ebuf
);
495 if( device_id
== -1 )
498 if( iface_bind(sock_fd
, device_id
, ebuf
) == -1 )
501 /* Select promiscous mode on/off */
503 /* XXX: We got reports that this does not work in 2.3.99.
504 * Need to investigate. Using ioctl to switch the promisc
505 * mode at device level costs us most of the benefits of
506 * using the new kernel interface.
507 * UPDATE: I found the bug. The kernel checks mr_alen
508 * even if it is of zero interest for the request. A
509 * random value there made the kernel return EINVAL.
510 * Probably the right solution is to memset the whole
511 * struct at first. */
513 memset( &mr
, 0, sizeof(mr
) );
514 mr
.mr_ifindex
= device_id
;
515 mr
.mr_type
= promisc
?
516 PACKET_MR_PROMISC
: PACKET_MR_ALLMULTI
;
517 if( setsockopt( sock_fd
, SOL_PACKET
, PACKET_ADD_MEMBERSHIP
,
518 &mr
, sizeof(mr
) ) == -1 )
520 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
521 "setsockopt: %s", pcap_strerror(errno
));
525 /* Compute the buffersize */
527 mtu
= iface_get_mtu(sock_fd
, device
, ebuf
);
530 handle
->bufsize
= MAX_LINKHEADER_SIZE
+ mtu
;
532 /* Fill in the pcap structure */
534 handle
->fd
= sock_fd
;
537 handle
->buffer
= malloc( handle
->bufsize
);
538 if( !handle
->buffer
) {
539 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
540 "malloc: %s", pcap_strerror(errno
));
553 "New packet capturing interface not supported by build "
554 "environment", PCAP_ERRBUF_SIZE
);
559 #ifdef HAVE_NETPACKET_PACKET_H
563 Return the index of the given device name. Fill ebuf and return
567 iface_get_id( int fd
, const char *device
, char *ebuf
)
571 memset( &ifr
, 0, sizeof(ifr
) );
572 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
574 if( ioctl(fd
, SIOCGIFINDEX
, &ifr
) == -1 ) {
575 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
576 "ioctl: %s", pcap_strerror(errno
));
580 return ifr
.ifr_ifindex
;
586 Bind the socket associated with FD to the given device.
589 iface_bind( int fd
, int ifindex
, char *ebuf
)
591 struct sockaddr_ll sll
;
593 memset( &sll
, 0, sizeof(sll
) );
594 sll
.sll_family
= AF_PACKET
;
595 sll
.sll_ifindex
= ifindex
;
596 sll
.sll_protocol
= htons(ETH_P_ALL
);
598 if( bind(fd
, (struct sockaddr
*) &sll
, sizeof(sll
)) == -1 ) {
599 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
600 "bind: %s", pcap_strerror(errno
));
610 /* ===== Functions to interface to the older kernels ================== */
612 /* With older kernels promiscuous mode is kind of interesting because we
613 * have to reset the interface before exiting. The problem can't really
614 * be solved without some daemon taking care of managing usage counts.
615 * We save the promiscuous state of the device when opening the capture
616 * stream and arrange for it to be reset on process exit.
618 * XXX: This solution is still not correct even for this case. The
619 * devices stay in promiscuous mode until the process exits. I need to
620 * modify pcap_close to solve this. */
622 struct ifreq restore_ifr
;
623 /* Contains the device name and the interface flags to be restored
626 static void restore_interface( void )
628 int status
= socket(PF_INET
, SOCK_PACKET
, 0);
631 status
= ioctl(status
, SIOCSIFFLAGS
, &restore_ifr
);
635 "Can't restore interface flags. Please adjust manually. \n"
636 "Hint: This can't happen with Linux >= 2.2.0.\n");
643 Try to open a packet socket using the old kernel interface.
644 Returns 0 on failure.
645 FIXME: 0 uses to mean success (Sebastian)
648 live_open_old( pcap_t
*handle
, char *device
, int promisc
,
649 int to_ms
, char *ebuf
)
651 int sock_fd
= -1, mtu
, arptype
;
655 /* Open the socket */
657 sock_fd
= socket( PF_INET
, SOCK_PACKET
, htons(ETH_P_ALL
) );
658 if( sock_fd
== -1 ) {
659 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
660 "socket: %s", pcap_strerror(errno
));
664 /* It worked - we are using the old interface */
665 handle
->md
.sock_packet
= 1;
667 /* Bind to the given device */
670 strncpy(ebuf
, "pcap_open_live: No interface given",
674 if( iface_bind_old(sock_fd
, device
, ebuf
) == -1 )
677 /* Go to promisc mode */
679 memset( &ifr
, 0, sizeof(ifr
) );
680 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
681 if( ioctl(sock_fd
, SIOCGIFFLAGS
, &ifr
) == -1 ) {
682 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
683 "ioctl: %s", pcap_strerror(errno
));
686 if( (ifr
.ifr_flags
& IFF_PROMISC
) == 0 ) {
688 ifr
.ifr_flags
|= IFF_PROMISC
;
689 if( ioctl(sock_fd
, SIOCSIFFLAGS
, &ifr
) == -1 ) {
690 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
692 pcap_strerror(errno
));
695 if( atexit(restore_interface
) == -1 ) {
697 strncpy(ebuf
, "atexit failed",
705 /* Compute the buffersize */
707 mtu
= iface_get_mtu(sock_fd
, device
, ebuf
);
710 handle
->bufsize
= MAX_LINKHEADER_SIZE
+ mtu
;
712 /* All done - fill in the pcap handle */
714 arptype
= iface_get_arptype(sock_fd
, device
, ebuf
);
718 handle
->fd
= sock_fd
;
720 handle
->linktype
= map_arphrd_to_dlt( arptype
);
721 if( handle
->linktype
== -1 ) {
722 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
723 "interface type of %s not supported", device
);
726 handle
->buffer
= malloc( handle
->bufsize
);
727 if( !handle
->buffer
) {
728 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
729 "malloc: %s", pcap_strerror(errno
));
745 Bind the socket associated with FD to the given device using the
746 interface of the old kernels.
749 iface_bind_old( int fd
, const char *device
, char *ebuf
)
751 struct sockaddr saddr
;
753 memset( &saddr
, 0, sizeof(saddr
) );
754 strncpy( saddr
.sa_data
, device
, sizeof(saddr
.sa_data
) );
755 if( bind(fd
, &saddr
, sizeof(saddr
)) == -1 ) {
756 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
757 "bind: %s", pcap_strerror(errno
));
765 /* ===== System calls available on all supported kernels ============== */
770 Query the kernel for the MTU of the given interface.
773 iface_get_mtu( int fd
, const char *device
, char *ebuf
)
777 memset( &ifr
, 0, sizeof(ifr
) );
778 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
780 if( ioctl(fd
, SIOCGIFMTU
, &ifr
) == -1 ) {
781 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
782 "ioctl: %s", pcap_strerror(errno
));
792 Get the hardware type of the given interface as ARPHRD_xxx constant.
795 iface_get_arptype( int fd
, const char *device
, char *ebuf
)
799 memset( &ifr
, 0, sizeof(ifr
) );
800 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
802 if( ioctl(fd
, SIOCGIFHWADDR
, &ifr
) == -1 ) {
803 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
804 "ioctl: %s", pcap_strerror(errno
));
808 return ifr
.ifr_hwaddr
.sa_family
;