2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Copyright 2009, 2010 Emmanuel Roullit.
5 * Subject to the GPL, version 2.
19 #include <arpa/inet.h>
27 #include <sys/socket.h>
28 #include <sys/ioctl.h>
30 #include <sys/resource.h>
31 #include <sys/epoll.h>
32 #include <sys/syscall.h>
33 #include <asm/unistd.h>
35 #include <linux/socket.h>
36 #include <linux/types.h>
37 #include <linux/if_ether.h>
38 #include <linux/if_packet.h>
39 #include <linux/sockios.h>
40 #include <netinet/tcp.h>
41 #include <netinet/udp.h>
56 #define SMEM_SUG_MAX 104857600
57 #define SMEM_SUG_DEF 4194304
59 static const char *const to_prio
[] = {
66 static const char *const sock_mem
[] = {
67 "/proc/sys/net/core/rmem_max",
68 "/proc/sys/net/core/rmem_default",
69 "/proc/sys/net/core/wmem_max",
70 "/proc/sys/net/core/wmem_default",
77 if (unlikely(af
!= AF_INET
&& af
!= AF_INET6
))
78 panic("Wrong AF socket type!\n");
80 sock
= socket(af
, SOCK_DGRAM
, 0);
81 if (unlikely(sock
< 0))
82 panic("Creation AF socket failed!\n");
89 int sock
= socket(PF_PACKET
, SOCK_RAW
, htons(ETH_P_ALL
));
90 if (unlikely(sock
< 0))
91 panic("Creation of PF socket failed!\n");
96 void set_sock_prio(int fd
, int prio
)
100 ret
= setsockopt(fd
, SOL_SOCKET
, SO_PRIORITY
, &val
, sizeof(val
));
102 panic("Cannot set socket priority!\n");
105 void set_udp_cork(int fd
)
109 ret
= setsockopt(fd
, IPPROTO_UDP
, UDP_CORK
, &state
, sizeof(state
));
111 panic("Cannot cork UDP socket!\n");
114 void set_udp_uncork(int fd
)
118 ret
= setsockopt(fd
, IPPROTO_UDP
, UDP_CORK
, &state
, sizeof(state
));
120 panic("Cannot uncork UDP socket!\n");
123 void set_tcp_cork(int fd
)
127 ret
= setsockopt(fd
, IPPROTO_TCP
, TCP_CORK
, &state
, sizeof(state
));
129 panic("Cannot cork TCP socket!\n");
132 void set_tcp_uncork(int fd
)
136 ret
= setsockopt(fd
, IPPROTO_TCP
, TCP_CORK
, &state
, sizeof(state
));
138 panic("Cannot uncork TCP socket!\n");
141 void set_sock_cork(int fd
, int udp
)
149 void set_sock_uncork(int fd
, int udp
)
157 void set_nonblocking(int fd
)
159 int ret
= fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFD
, 0) | O_NONBLOCK
);
160 if (unlikely(ret
< 0))
161 panic("Cannot fcntl!\n");
164 int set_nonblocking_sloppy(int fd
)
166 return fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFD
, 0) | O_NONBLOCK
);
169 void set_socket_keepalive(int fd
)
173 ret
= setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &one
, sizeof(one
));
175 panic("Cannot set TCP keepalive!\n");
178 void set_tcp_nodelay(int fd
)
181 setsockopt(fd
, IPPROTO_TCP
, TCP_NODELAY
, &one
, sizeof(one
));
184 int set_ipv6_only(int fd
)
187 return setsockopt(fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
190 int set_reuseaddr(int fd
)
194 ret
= setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
195 if (unlikely(ret
< 0))
196 panic("Cannot reuse addr!\n");
201 void set_mtu_disc_dont(int fd
)
203 int mtu
= IP_PMTUDISC_DONT
, ret
;
205 ret
= setsockopt(fd
, SOL_IP
, IP_MTU_DISCOVER
, &mtu
, sizeof(mtu
));
207 panic("Cannot set MTU discovery options!\n");
210 void set_epoll_descriptor(int fd_epoll
, int action
, int fd_toadd
, int events
)
213 struct epoll_event ev
;
215 memset(&ev
, 0, sizeof(ev
));
217 ev
.data
.fd
= fd_toadd
;
219 ret
= epoll_ctl(fd_epoll
, action
, fd_toadd
, &ev
);
221 panic("Cannot add socket for epoll!\n");
224 int set_epoll_descriptor2(int fd_epoll
, int action
, int fd_toadd
, int events
)
226 struct epoll_event ev
;
228 memset(&ev
, 0, sizeof(ev
));
230 ev
.data
.fd
= fd_toadd
;
232 return epoll_ctl(fd_epoll
, action
, fd_toadd
, &ev
);
235 u32
wireless_bitrate(const char *ifname
)
237 int sock
, ret
, rate_in_mbit
;
240 sock
= af_socket(AF_INET
);
242 memset(&iwr
, 0, sizeof(iwr
));
243 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
245 ret
= ioctl(sock
, SIOCGIWRATE
, &iwr
);
247 rate_in_mbit
= iwr
.u
.bitrate
.value
/ 1000000;
256 void drop_privileges(bool enforce
, uid_t uid
, gid_t gid
)
260 panic("Uid cannot be the same as the current user!\n");
262 panic("Gid cannot be the same as the current user!\n");
264 if (setgid(gid
) != 0)
265 panic("Unable to drop group privileges: %s!\n", strerror(errno
));
266 if (setuid(uid
) != 0)
267 panic("Unable to drop user privileges: %s!\n", strerror(errno
));
270 int get_system_socket_mem(int which
)
274 const char *file
= sock_mem
[which
];
277 fd
= open(file
, O_RDONLY
);
281 ret
= read(fd
, buff
, sizeof(buff
));
289 void set_system_socket_mem(int which
, int val
)
292 const char *file
= sock_mem
[which
];
296 fd
= open(file
, O_WRONLY
);
300 memset(buff
, 0, sizeof(buff
));
301 slprintf(buff
, sizeof(buff
), "%d", val
);
303 ret
= write(fd
, buff
, strlen(buff
));
309 int wireless_sigqual(const char *ifname
, struct iw_statistics
*stats
)
314 sock
= af_socket(AF_INET
);
316 memset(&iwr
, 0, sizeof(iwr
));
317 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
319 iwr
.u
.data
.pointer
= (caddr_t
) stats
;
320 iwr
.u
.data
.length
= sizeof(*stats
);
321 iwr
.u
.data
.flags
= 1;
323 ret
= ioctl(sock
, SIOCGIWSTATS
, &iwr
);
330 int wireless_rangemax_sigqual(const char *ifname
)
332 int ret
, sock
, sigqual
;
334 struct iw_range iwrange
;
336 sock
= af_socket(AF_INET
);
338 memset(&iwrange
, 0, sizeof(iwrange
));
340 memset(&iwr
, 0, sizeof(iwr
));
341 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
343 iwr
.u
.data
.pointer
= (caddr_t
) &iwrange
;
344 iwr
.u
.data
.length
= sizeof(iwrange
);
345 iwr
.u
.data
.flags
= 0;
347 ret
= ioctl(sock
, SIOCGIWRANGE
, &iwr
);
349 sigqual
= iwrange
.max_qual
.qual
;
358 u32
ethtool_bitrate(const char *ifname
)
360 int ret
, sock
, bitrate
;
362 struct ethtool_cmd ecmd
;
364 sock
= af_socket(AF_INET
);
366 memset(&ecmd
, 0, sizeof(ecmd
));
368 memset(&ifr
, 0, sizeof(ifr
));
369 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
371 ecmd
.cmd
= ETHTOOL_GSET
;
372 ifr
.ifr_data
= (char *) &ecmd
;
374 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
380 switch (ecmd
.speed
) {
386 bitrate
= ecmd
.speed
;
398 int ethtool_link(const char *ifname
)
402 struct ethtool_value ecmd
;
404 sock
= af_socket(AF_INET
);
406 memset(&ecmd
, 0, sizeof(ecmd
));
408 memset(&ifr
, 0, sizeof(ifr
));
409 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
411 ecmd
.cmd
= ETHTOOL_GLINK
;
412 ifr
.ifr_data
= (char *) &ecmd
;
414 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
424 int ethtool_drvinf(const char *ifname
, struct ethtool_drvinfo
*drvinf
)
429 sock
= af_socket(AF_INET
);
431 memset(drvinf
, 0, sizeof(*drvinf
));
433 memset(&ifr
, 0, sizeof(ifr
));
434 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
436 drvinf
->cmd
= ETHTOOL_GDRVINFO
;
437 ifr
.ifr_data
= (char *) drvinf
;
439 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
446 u32
device_bitrate(const char *ifname
)
448 u32 speed_c
, speed_w
;
450 speed_c
= ethtool_bitrate(ifname
);
451 speed_w
= wireless_bitrate(ifname
);
453 return (speed_c
== 0 ? speed_w
: speed_c
);
456 int device_ifindex(const char *ifname
)
458 int ret
, sock
, index
;
461 if (!strncmp("any", ifname
, strlen("any")))
464 sock
= af_socket(AF_INET
);
466 memset(&ifr
, 0, sizeof(ifr
));
467 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
469 ret
= ioctl(sock
, SIOCGIFINDEX
, &ifr
);
471 index
= ifr
.ifr_ifindex
;
480 static int __device_address6(const char *ifname
, struct sockaddr_storage
*ss
)
482 int ret
, family
, found
= -EINVAL
;
483 struct ifaddrs
*ifaddr
, *ifa
;
485 ret
= getifaddrs(&ifaddr
);
487 panic("Cannot get device addresses for IPv6!\n");
489 for (ifa
= ifaddr
; ifa
!= NULL
; ifa
= ifa
->ifa_next
) {
490 family
= ifa
->ifa_addr
->sa_family
;
491 if (family
!= AF_INET6
)
493 if (strcmp(ifa
->ifa_name
, ifname
))
496 memcpy(ss
, ifa
->ifa_addr
, sizeof(*ss
));
505 int device_address(const char *ifname
, int af
, struct sockaddr_storage
*ss
)
512 if (!strncmp("any", ifname
, strlen("any")))
515 return __device_address6(ifname
, ss
);
517 sock
= af_socket(af
);
519 memset(&ifr
, 0, sizeof(ifr
));
520 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
522 ifr
.ifr_addr
.sa_family
= af
;
524 ret
= ioctl(sock
, SIOCGIFADDR
, &ifr
);
526 memcpy(ss
, &ifr
.ifr_addr
, sizeof(ifr
.ifr_addr
));
533 int device_mtu(const char *ifname
)
538 sock
= af_socket(AF_INET
);
540 memset(&ifr
, 0, sizeof(ifr
));
541 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
543 ret
= ioctl(sock
, SIOCGIFMTU
, &ifr
);
554 short device_get_flags(const char *ifname
)
556 /* Really, it's short! Look at struct ifreq */
561 sock
= af_socket(AF_INET
);
563 memset(&ifr
, 0, sizeof(ifr
));
564 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
566 ret
= ioctl(sock
, SIOCGIFFLAGS
, &ifr
);
568 flags
= ifr
.ifr_flags
;
577 void device_set_flags(const char *ifname
, const short flags
)
582 sock
= af_socket(AF_INET
);
584 memset(&ifr
, 0, sizeof(ifr
));
585 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
587 ifr
.ifr_flags
= flags
;
589 ret
= ioctl(sock
, SIOCSIFFLAGS
, &ifr
);
591 panic("Cannot set NIC flags!\n");
596 void register_signal(int signal
, void (*handler
)(int))
599 struct sigaction saction
;
601 sigfillset(&block_mask
);
603 saction
.sa_handler
= handler
;
604 saction
.sa_mask
= block_mask
;
605 saction
.sa_flags
= SA_RESTART
;
607 sigaction(signal
, &saction
, NULL
);
610 void register_signal_f(int signal
, void (*handler
)(int), int flags
)
613 struct sigaction saction
;
615 sigfillset(&block_mask
);
617 saction
.sa_handler
= handler
;
618 saction
.sa_mask
= block_mask
;
619 saction
.sa_flags
= flags
;
621 sigaction(signal
, &saction
, NULL
);
624 short enter_promiscuous_mode(char *ifname
)
628 if (!strncmp("any", ifname
, strlen("any")))
631 ifflags
= device_get_flags(ifname
);
632 device_set_flags(ifname
, ifflags
| IFF_PROMISC
);
637 void leave_promiscuous_mode(char *ifname
, short oldflags
)
639 if (!strncmp("any", ifname
, strlen("any")))
642 device_set_flags(ifname
, oldflags
);
645 int device_up_and_running(char *ifname
)
649 if (!strncmp("any", ifname
, strlen("any")))
652 return (device_get_flags(ifname
) & (IFF_UP
| IFF_RUNNING
)) == (IFF_UP
| IFF_RUNNING
);
655 void cpu_affinity(int cpu
)
658 cpu_set_t cpu_bitmask
;
660 CPU_ZERO(&cpu_bitmask
);
661 CPU_SET(cpu
, &cpu_bitmask
);
663 ret
= sched_setaffinity(getpid(), sizeof(cpu_bitmask
),
666 panic("Can't set this cpu affinity!\n");
669 int set_proc_prio(int priority
)
671 int ret
= setpriority(PRIO_PROCESS
, getpid(), priority
);
673 panic("Can't set nice val to %i!\n", priority
);
678 int set_sched_status(int policy
, int priority
)
680 int ret
, min_prio
, max_prio
;
681 struct sched_param sp
;
683 max_prio
= sched_get_priority_max(policy
);
684 min_prio
= sched_get_priority_min(policy
);
686 if (max_prio
== -1 || min_prio
== -1)
687 printf("Cannot determine scheduler prio limits!\n");
688 else if (priority
< min_prio
)
690 else if (priority
> max_prio
)
693 memset(&sp
, 0, sizeof(sp
));
694 sp
.sched_priority
= priority
;
696 ret
= sched_setscheduler(getpid(), policy
, &sp
);
698 printf("Cannot set scheduler policy!\n");
702 ret
= sched_setparam(getpid(), &sp
);
704 printf("Cannot set scheduler prio!\n");
711 int get_default_sched_policy(void)
716 int get_default_sched_prio(void)
718 return sched_get_priority_max(get_default_sched_policy());
721 int get_default_proc_prio(void)
726 void set_system_socket_memory(int *vals
, size_t len
)
730 if ((vals
[0] = get_system_socket_mem(sock_rmem_max
)) < SMEM_SUG_MAX
)
731 set_system_socket_mem(sock_rmem_max
, SMEM_SUG_MAX
);
732 if ((vals
[1] = get_system_socket_mem(sock_rmem_def
)) < SMEM_SUG_DEF
)
733 set_system_socket_mem(sock_rmem_def
, SMEM_SUG_DEF
);
734 if ((vals
[2] = get_system_socket_mem(sock_wmem_max
)) < SMEM_SUG_MAX
)
735 set_system_socket_mem(sock_wmem_max
, SMEM_SUG_MAX
);
736 if ((vals
[3] = get_system_socket_mem(sock_wmem_def
)) < SMEM_SUG_DEF
)
737 set_system_socket_mem(sock_wmem_def
, SMEM_SUG_DEF
);
740 void reset_system_socket_memory(int *vals
, size_t len
)
744 set_system_socket_mem(sock_rmem_max
, vals
[0]);
745 set_system_socket_mem(sock_rmem_def
, vals
[1]);
746 set_system_socket_mem(sock_wmem_max
, vals
[2]);
747 set_system_socket_mem(sock_wmem_def
, vals
[3]);
750 void set_itimer_interval_value(struct itimerval
*itimer
, unsigned long sec
,
753 itimer
->it_interval
.tv_sec
= sec
;
754 itimer
->it_interval
.tv_usec
= usec
;
756 itimer
->it_value
.tv_sec
= sec
;
757 itimer
->it_value
.tv_usec
= usec
;