]>
The Tcpdump Group git mirrors - libpcap/blob - pcap-linux.c
c5f1d7928f9053991b0b934b7af2707aab960c82
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.
61 #include <sys/socket.h>
62 #include <sys/ioctl.h>
64 #include <netinet/in.h>
65 #include <linux/if_ether.h>
66 #include <netinet/if_ether.h>
68 #ifdef HAVE_NETPACKET_PACKET_H
69 #include <netpacket/packet.h>
71 #ifdef SO_ATTACH_FILTER
72 #include <linux/types.h>
73 #include <linux/filter.h>
77 typedef int socklen_t
;
84 #define MAX_LINKHEADER_SIZE 256
86 /* Prototypes for internal functions */
87 static int map_arphrd_to_dlt( int arptype
);
88 static int live_open_old( pcap_t
*, char *, int, int, char * );
89 static int live_open_new( pcap_t
*, char *, int, int, char * );
90 static int pcap_read_packet( pcap_t
*, pcap_handler
, u_char
* );
92 /* Wrap some ioctl calls */
93 static int iface_get_id( int fd
, const char *device
, char *ebuf
);
94 static int iface_get_mtu( int fd
, const char *device
, char *ebuf
);
95 static int iface_get_arptype( int fd
, const char *device
, char *ebuf
);
96 static int iface_bind( int fd
, int ifindex
, char *ebuf
);
97 static int iface_bind_old( int fd
, const char *device
, char *ebuf
);
102 Get a handle for a live capture from the given device. You can
103 pass NULL as device to get all packages (without link level
104 information of course). If you pass 1 as promisc the interface
105 will be set to promiscous mode (XXX: I think this usage should
106 be deprecated and functions be added to select that later allow
107 modification of that values -- Torsten).
112 pcap_open_live( char *device
, int snaplen
, int promisc
, int to_ms
, char *ebuf
)
114 /* Allocate a handle for this session. */
116 pcap_t
*handle
= malloc(sizeof(*handle
));
117 if( handle
== NULL
) {
118 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "malloc: %s",
119 pcap_strerror(errno
));
123 /* Initialize some components of the pcap structure. */
125 memset( handle
, 0, sizeof(*handle
) );
126 handle
->snapshot
= snaplen
;
127 handle
->md
.timeout
= to_ms
;
128 handle
->md
.promisc
= promisc
;
129 handle
->md
.device
= strdup( device
);
130 if( handle
->md
.device
== NULL
) {
131 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "strdup: %s",
132 pcap_strerror(errno
) );
137 /* Current Linux kernels use the protocol family PF_PACKET to
138 * allow direct access to all packets on the network while
139 * older kernels had a special socket type SOCK_PACKET to
140 * implement this feature.
141 * While this old implementation is kind of obsolete we need
142 * to be compatible with older kernels for a while so we are
143 * trying both methods with the newer method preferred. */
145 if( ! (live_open_new(handle
, device
, promisc
, to_ms
, ebuf
) ||
146 live_open_old(handle
, device
, promisc
, to_ms
, ebuf
)) )
148 /* Both methods to open the packet socket failed. Tidy
149 * up and report our failure (ebuf is expected to be
150 * set by the functions above). */
152 free(handle
->md
.device
);
157 /* Okay, now we have a packet stream open. Maybe we need to handle
158 * a timeout? In that case we set the filehandle to nonblocking
159 * so pcap_read can try reading the fd and call select if no data
160 * is available at once. */
163 int flags
= fcntl( handle
->fd
, F_GETFL
);
166 flags
= fcntl( handle
->fd
, F_SETFL
, flags
);
169 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "fcntl: %s",
170 pcap_strerror(errno
));
171 pcap_close( handle
);
182 Read at most max_packets from the capture stream and
183 call the callback for each of them. Returns the number
184 of packets handled or -1 if an error occured.
186 XXX: Can I rely on the Linux-specified behaviour of select
187 (returning the time left in the timeval structure)? I really
188 don't want to query the system time before each select call...
191 pcap_read(pcap_t
*handle
, int max_packets
, pcap_handler callback
, u_char
*user
)
197 if( handle
->md
.timeout
> 0 ) {
198 tv
.tv_usec
= (handle
->md
.timeout
% 1000) * 1000;
199 tv
.tv_sec
= (handle
->md
.timeout
/ 1000);
202 for( packets
= 0; max_packets
== -1 || packets
< max_packets
; )
204 status
= pcap_read_packet( handle
, callback
, user
);
209 } else if( status
== -1 )
212 /* paranoia - the recvmsg call should block if we don't use
214 if( handle
->md
.timeout
<= 0 )
217 /* No packet available - go to sleep */
218 FD_ZERO( &read_fds
);
219 FD_SET( handle
->fd
, &read_fds
);
220 status
= select( handle
->fd
+ 1,
221 &read_fds
, NULL
, NULL
, &tv
);
223 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
224 "select: %s", pcap_strerror(errno
));
226 } else if( status
== 0 ||
227 (tv
.tv_usec
== 0 && tv
.tv_sec
== 0) )
237 Read a packet from the socket calling the handler provided by
238 the user. Returns 0 if no packet was there, 1 if a packet was
239 handled and -1 if an error occured.
242 pcap_read_packet( pcap_t
*handle
, pcap_handler callback
, u_char
*userdata
)
244 struct sockaddr from
;
246 int packet_len
, caplen
;
247 struct pcap_pkthdr pcap_header
;
249 /* We don't currently use the from return value of recvfrom but
250 * this will probably implemented in the future. */
252 /* Receive a single packet from the kernel */
254 fromlen
= sizeof(from
);
255 packet_len
= recvfrom(
256 handle
->fd
, handle
->buffer
+ handle
->offset
,
257 handle
->snapshot
, MSG_TRUNC
,
258 (struct sockaddr
*) &from
, &fromlen
);
259 } while( packet_len
== -1 && errno
== EINTR
);
261 /* Check if some error occured */
262 if( packet_len
== -1 ) {
263 if( errno
== EAGAIN
)
264 return 0; /* no packet there */
266 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
267 "recvfrom: %s", pcap_strerror(errno
));
272 /* XXX: According to the kernel source we should get the real
273 * packet len if calling recvfrom with MSG_TRUNC set. It does
274 * not seem to work here :(, but it is supported by this code
278 if( caplen
> handle
->snapshot
)
279 caplen
= handle
->snapshot
;
281 /* Run the packet filter if not using kernel filter */
282 if( !handle
->md
.use_bpf
&& handle
->fcode
.bf_insns
) {
283 if( bpf_filter(handle
->fcode
.bf_insns
, handle
->buffer
,
284 packet_len
, caplen
) == 0 )
286 /* rejected by filter */
291 /* Fill in our own header data */
293 if( ioctl(handle
->fd
, SIOCGSTAMP
, &pcap_header
.ts
) == -1 ) {
294 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
295 "ioctl: %s", pcap_strerror(errno
));
298 pcap_header
.caplen
= caplen
;
299 pcap_header
.len
= packet_len
;
301 /* Call the user supplied callback function */
302 handle
->md
.stat
.ps_recv
++;
303 callback( userdata
, &pcap_header
, handle
->buffer
+ handle
->offset
);
311 Get the statistics for the given packet capture handle.
314 pcap_stats( pcap_t
*handle
, struct pcap_stat
*stats
)
316 *stats
= handle
->md
.stat
;
323 Attach the given BPF code to the packet capture device.
326 pcap_setfilter( pcap_t
*handle
, struct bpf_program
*filter
)
328 #ifdef SO_ATTACH_FILTER
329 struct sock_fprog fcode
;
335 strncpy(handle
->errbuf
, "setfilter: No filter specified",
336 sizeof(handle
->errbuf
));
340 /* Free old filter code if existing */
341 handle
->fcode
.bf_len
= 0;
342 if( handle
->fcode
.bf_insns
) {
343 free( handle
->fcode
.bf_insns
);
344 handle
->fcode
.bf_insns
= NULL
;
348 /* Make our private copy of the filter */
349 handle
->fcode
.bf_len
= filter
->bf_len
;
350 handle
->fcode
.bf_insns
=
351 malloc( filter
->bf_len
* sizeof(*filter
->bf_insns
) );
352 if( handle
->fcode
.bf_insns
== NULL
) {
353 snprintf(handle
->errbuf
, sizeof(handle
->errbuf
),
354 "malloc: %s", pcap_strerror(errno
));
357 memcpy( handle
->fcode
.bf_insns
, filter
->bf_insns
,
358 filter
->bf_len
* sizeof(*filter
->bf_insns
) );
360 /* Run user level packet filter by default. Will be overriden if
361 * installing a kernel filter succeeds. */
362 handle
->md
.use_bpf
= 0;
364 /* Install kernel level filter if possible */
366 #ifdef SO_ATTACH_FILTER
367 /* Oh joy, the Linux kernel uses struct sock_fprog instead of
368 * struct bpf_program and of course the length field is of
369 * different size. Pointed out by Sebastian */
371 fcode
.filter
= (struct sock_filter
*) handle
->fcode
.bf_insns
;
372 fcode
.len
= filter
->bf_len
;
373 if( filter
->bf_len
> USHRT_MAX
) {
374 fprintf( stderr
, "Warning: Filter to complex for kernel\n" );
375 /* paranoid - should never happen */
377 else if( setsockopt(handle
->fd
, SOL_SOCKET
, SO_ATTACH_FILTER
,
378 &fcode
, sizeof(fcode
)) == 0 )
380 handle
->md
.use_bpf
= 1;
383 /* Print a warning if kernel filter available but a problem
384 * occured using it. */
385 if( errno
!= ENOPROTOOPT
&& errno
!= EOPNOTSUPP
) {
386 fprintf( stderr
, "Warning: Kernel filter failed: %s\n",
387 pcap_strerror(errno
) );
399 Linux uses the ARP hardware type to identify the type of an
400 interface. pcap uses the DLT_xxx constants for this. This
401 function maps the ARPHRD_xxx constant to an appropriate
404 Returns -1 if unable to map the type.
406 static int map_arphrd_to_dlt( int arptype
)
410 case ARPHRD_METRICOM
:
411 case ARPHRD_LOOPBACK
: return DLT_EN10MB
;
412 case ARPHRD_EETHER
: return DLT_EN3MB
;
413 case ARPHRD_AX25
: return DLT_AX25
;
414 case ARPHRD_PRONET
: return DLT_PRONET
;
415 case ARPHRD_CHAOS
: return DLT_CHAOS
;
416 case ARPHRD_IEEE802
: return DLT_IEEE802
;
417 case ARPHRD_ARCNET
: return DLT_ARCNET
;
418 case ARPHRD_FDDI
: return DLT_FDDI
;
424 case ARPHRD_SLIP
: return DLT_RAW
;
430 /* ===== Functions to interface to the newer kernels ================== */
435 Try to open a packet socket using the new kernel interface.
436 Returns 0 on failure.
437 FIXME: 0 uses to mean success (Sebastian)
440 live_open_new( pcap_t
*handle
, char *device
, int promisc
,
441 int to_ms
, char *ebuf
)
443 #ifdef HAVE_NETPACKET_PACKET_H
444 int sock_fd
= -1, device_id
, mtu
, arptype
;
445 struct packet_mreq mr
;
447 /* One shot loop used for error handling - bail out with break */
451 /* Open a socket with protocol family packet. */
452 sock_fd
= socket( PF_PACKET
, SOCK_RAW
, htons(ETH_P_ALL
) );
453 if( sock_fd
== -1 ) {
454 snprintf(ebuf
, PCAP_ERRBUF_SIZE
, "socket: %s",
455 pcap_strerror(errno
) );
459 /* It seems the kernel supports the new interface. */
460 handle
->md
.sock_packet
= 0;
462 /* Currently we only support monitoring a single interface.
463 * While the kernel can do more I want to reimplement the
464 * old features first before adding more. */
467 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
468 "pcap_open_live: No device given" );
472 /* What kind of frames do we have to deal with? Fall back
473 * to cooked mode if we have an unknown interface type. */
475 arptype
= iface_get_arptype(sock_fd
, device
, ebuf
);
478 handle
->linktype
= map_arphrd_to_dlt( arptype
);
479 if( handle
->linktype
== -1 ) {
480 /* Unknown interface type - reopen in cooked mode */
482 if( close(sock_fd
) == -1 ) {
483 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
484 "close: %s", pcap_strerror(errno
));
487 sock_fd
= socket( PF_PACKET
, SOCK_DGRAM
,
489 if( sock_fd
== -1 ) {
490 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
491 "socket: %s", pcap_strerror(errno
));
496 "Warning: Falling back to cooked socket\n" );
497 handle
->linktype
= DLT_RAW
;
501 device_id
= iface_get_id( sock_fd
, device
, ebuf
);
502 if( device_id
== -1 )
505 if( iface_bind(sock_fd
, device_id
, ebuf
) == -1 )
508 /* Select promiscous mode on/off */
510 /* XXX: We got reports that this does not work in 2.3.99.
511 * Need to investigate. Using ioctl to switch the promisc
512 * mode at device level costs us most of the benefits of
513 * using the new kernel interface.
514 * UPDATE: I found the bug. The kernel checks mr_alen
515 * even if it is of zero interest for the request. A
516 * random value there made the kernel return EINVAL.
517 * Probably the right solution is to memset the whole
518 * struct at first. */
520 memset( &mr
, 0, sizeof(mr
) );
521 mr
.mr_ifindex
= device_id
;
522 mr
.mr_type
= promisc
?
523 PACKET_MR_PROMISC
: PACKET_MR_ALLMULTI
;
524 if( setsockopt( sock_fd
, SOL_PACKET
, PACKET_ADD_MEMBERSHIP
,
525 &mr
, sizeof(mr
) ) == -1 )
527 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
528 "setsockopt: %s", pcap_strerror(errno
));
532 /* Compute the buffersize */
534 mtu
= iface_get_mtu(sock_fd
, device
, ebuf
);
537 handle
->bufsize
= MAX_LINKHEADER_SIZE
+ mtu
;
539 /* Fill in the pcap structure */
541 handle
->fd
= sock_fd
;
544 handle
->buffer
= malloc( handle
->bufsize
);
545 if( !handle
->buffer
) {
546 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
547 "malloc: %s", pcap_strerror(errno
));
560 "New packet capturing interface not supported by build "
561 "environment", PCAP_ERRBUF_SIZE
);
566 #ifdef HAVE_NETPACKET_PACKET_H
570 Return the index of the given device name. Fill ebuf and return
574 iface_get_id( int fd
, const char *device
, char *ebuf
)
578 memset( &ifr
, 0, sizeof(ifr
) );
579 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
581 if( ioctl(fd
, SIOCGIFINDEX
, &ifr
) == -1 ) {
582 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
583 "ioctl: %s", pcap_strerror(errno
));
587 return ifr
.ifr_ifindex
;
593 Bind the socket associated with FD to the given device.
596 iface_bind( int fd
, int ifindex
, char *ebuf
)
598 struct sockaddr_ll sll
;
600 memset( &sll
, 0, sizeof(sll
) );
601 sll
.sll_family
= AF_PACKET
;
602 sll
.sll_ifindex
= ifindex
;
603 sll
.sll_protocol
= htons(ETH_P_ALL
);
605 if( bind(fd
, (struct sockaddr
*) &sll
, sizeof(sll
)) == -1 ) {
606 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
607 "bind: %s", pcap_strerror(errno
));
617 /* ===== Functions to interface to the older kernels ================== */
619 /* With older kernels promiscuous mode is kind of interesting because we
620 * have to reset the interface before exiting. The problem can't really
621 * be solved without some daemon taking care of managing usage counts.
622 * We save the promiscuous state of the device when opening the capture
623 * stream and arrange for it to be reset on process exit.
625 * XXX: This solution is still not correct even for this case. The
626 * devices stay in promiscuous mode until the process exits. I need to
627 * modify pcap_close to solve this. */
629 struct ifreq restore_ifr
;
630 /* Contains the device name and the interface flags to be restored
633 static void restore_interface( void )
635 int status
= socket(PF_INET
, SOCK_PACKET
, 0);
638 status
= ioctl(status
, SIOCSIFFLAGS
, &restore_ifr
);
642 "Can't restore interface flags. Please adjust manually. \n"
643 "Hint: This can't happen with Linux >= 2.2.0.\n");
650 Try to open a packet socket using the old kernel interface.
651 Returns 0 on failure.
652 FIXME: 0 uses to mean success (Sebastian)
655 live_open_old( pcap_t
*handle
, char *device
, int promisc
,
656 int to_ms
, char *ebuf
)
658 int sock_fd
= -1, mtu
, arptype
;
662 /* Open the socket */
664 sock_fd
= socket( PF_INET
, SOCK_PACKET
, htons(ETH_P_ALL
) );
665 if( sock_fd
== -1 ) {
666 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
667 "socket: %s", pcap_strerror(errno
));
671 /* It worked - we are using the old interface */
672 handle
->md
.sock_packet
= 1;
674 /* Bind to the given device */
677 strncpy(ebuf
, "pcap_open_live: No interface given",
681 if( iface_bind_old(sock_fd
, device
, ebuf
) == -1 )
684 /* Go to promisc mode */
686 memset( &ifr
, 0, sizeof(ifr
) );
687 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
688 if( ioctl(sock_fd
, SIOCGIFFLAGS
, &ifr
) == -1 ) {
689 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
690 "ioctl: %s", pcap_strerror(errno
));
693 if( (ifr
.ifr_flags
& IFF_PROMISC
) == 0 ) {
695 ifr
.ifr_flags
|= IFF_PROMISC
;
696 if( ioctl(sock_fd
, SIOCSIFFLAGS
, &ifr
) == -1 ) {
697 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
699 pcap_strerror(errno
));
702 if( atexit(restore_interface
) == -1 ) {
704 strncpy(ebuf
, "atexit failed",
712 /* Compute the buffersize */
714 mtu
= iface_get_mtu(sock_fd
, device
, ebuf
);
717 handle
->bufsize
= MAX_LINKHEADER_SIZE
+ mtu
;
719 /* All done - fill in the pcap handle */
721 arptype
= iface_get_arptype(sock_fd
, device
, ebuf
);
725 handle
->fd
= sock_fd
;
727 handle
->linktype
= map_arphrd_to_dlt( arptype
);
728 if( handle
->linktype
== -1 ) {
729 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
730 "interface type of %s not supported", device
);
733 handle
->buffer
= malloc( handle
->bufsize
);
734 if( !handle
->buffer
) {
735 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
736 "malloc: %s", pcap_strerror(errno
));
752 Bind the socket associated with FD to the given device using the
753 interface of the old kernels.
756 iface_bind_old( int fd
, const char *device
, char *ebuf
)
758 struct sockaddr saddr
;
760 memset( &saddr
, 0, sizeof(saddr
) );
761 strncpy( saddr
.sa_data
, device
, sizeof(saddr
.sa_data
) );
762 if( bind(fd
, &saddr
, sizeof(saddr
)) == -1 ) {
763 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
764 "bind: %s", pcap_strerror(errno
));
772 /* ===== System calls available on all supported kernels ============== */
777 Query the kernel for the MTU of the given interface.
780 iface_get_mtu( int fd
, const char *device
, char *ebuf
)
784 memset( &ifr
, 0, sizeof(ifr
) );
785 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
787 if( ioctl(fd
, SIOCGIFMTU
, &ifr
) == -1 ) {
788 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
789 "ioctl: %s", pcap_strerror(errno
));
799 Get the hardware type of the given interface as ARPHRD_xxx constant.
802 iface_get_arptype( int fd
, const char *device
, char *ebuf
)
806 memset( &ifr
, 0, sizeof(ifr
) );
807 strncpy( ifr
.ifr_name
, device
, sizeof(ifr
.ifr_name
) );
809 if( ioctl(fd
, SIOCGIFHWADDR
, &ifr
) == -1 ) {
810 snprintf(ebuf
, PCAP_ERRBUF_SIZE
,
811 "ioctl: %s", pcap_strerror(errno
));
815 return ifr
.ifr_hwaddr
.sa_family
;