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_nonblocking(int fd
)
107 int ret
= fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFD
, 0) | O_NONBLOCK
);
108 if (unlikely(ret
< 0))
109 panic("Cannot fcntl!\n");
112 int set_nonblocking_sloppy(int fd
)
114 return fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFD
, 0) | O_NONBLOCK
);
117 void set_socket_keepalive(int fd
)
121 ret
= setsockopt(fd
, SOL_SOCKET
, SO_KEEPALIVE
, &one
, sizeof(one
));
123 panic("Cannot set TCP keepalive!\n");
126 void set_tcp_nodelay(int fd
)
129 setsockopt(fd
, IPPROTO_TCP
, TCP_NODELAY
, &one
, sizeof(one
));
132 int set_ipv6_only(int fd
)
135 return setsockopt(fd
, IPPROTO_IPV6
, IPV6_V6ONLY
, &one
, sizeof(one
));
138 int set_reuseaddr(int fd
)
142 ret
= setsockopt(fd
, SOL_SOCKET
, SO_REUSEADDR
, &one
, sizeof(one
));
143 if (unlikely(ret
< 0))
144 panic("Cannot reuse addr!\n");
149 void set_mtu_disc_dont(int fd
)
151 int mtu
= IP_PMTUDISC_DONT
, ret
;
153 ret
= setsockopt(fd
, SOL_IP
, IP_MTU_DISCOVER
, &mtu
, sizeof(mtu
));
155 panic("Cannot set MTU discovery options!\n");
158 void set_epoll_descriptor(int fd_epoll
, int action
, int fd_toadd
, int events
)
161 struct epoll_event ev
;
163 memset(&ev
, 0, sizeof(ev
));
165 ev
.data
.fd
= fd_toadd
;
167 ret
= epoll_ctl(fd_epoll
, action
, fd_toadd
, &ev
);
169 panic("Cannot add socket for epoll!\n");
172 int set_epoll_descriptor2(int fd_epoll
, int action
, int fd_toadd
, int events
)
174 struct epoll_event ev
;
176 memset(&ev
, 0, sizeof(ev
));
178 ev
.data
.fd
= fd_toadd
;
180 return epoll_ctl(fd_epoll
, action
, fd_toadd
, &ev
);
183 u32
wireless_bitrate(const char *ifname
)
185 int sock
, ret
, rate_in_mbit
;
188 sock
= af_socket(AF_INET
);
190 memset(&iwr
, 0, sizeof(iwr
));
191 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
193 ret
= ioctl(sock
, SIOCGIWRATE
, &iwr
);
195 rate_in_mbit
= iwr
.u
.bitrate
.value
/ 1000000;
204 void drop_privileges(bool enforce
, uid_t uid
, gid_t gid
)
208 panic("Uid cannot be the same as the current user!\n");
210 panic("Gid cannot be the same as the current user!\n");
212 if (setgid(gid
) != 0)
213 panic("Unable to drop group privileges: %s!\n", strerror(errno
));
214 if (setuid(uid
) != 0)
215 panic("Unable to drop user privileges: %s!\n", strerror(errno
));
218 int get_system_socket_mem(int which
)
222 const char *file
= sock_mem
[which
];
225 fd
= open(file
, O_RDONLY
);
229 ret
= read(fd
, buff
, sizeof(buff
));
237 void set_system_socket_mem(int which
, int val
)
240 const char *file
= sock_mem
[which
];
244 fd
= open(file
, O_WRONLY
);
248 memset(buff
, 0, sizeof(buff
));
249 slprintf(buff
, sizeof(buff
), "%d", val
);
251 ret
= write(fd
, buff
, strlen(buff
));
257 int wireless_sigqual(const char *ifname
, struct iw_statistics
*stats
)
262 sock
= af_socket(AF_INET
);
264 memset(&iwr
, 0, sizeof(iwr
));
265 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
267 iwr
.u
.data
.pointer
= (caddr_t
) stats
;
268 iwr
.u
.data
.length
= sizeof(*stats
);
269 iwr
.u
.data
.flags
= 1;
271 ret
= ioctl(sock
, SIOCGIWSTATS
, &iwr
);
278 int wireless_rangemax_sigqual(const char *ifname
)
280 int ret
, sock
, sigqual
;
282 struct iw_range iwrange
;
284 sock
= af_socket(AF_INET
);
286 memset(&iwrange
, 0, sizeof(iwrange
));
288 memset(&iwr
, 0, sizeof(iwr
));
289 strlcpy(iwr
.ifr_name
, ifname
, IFNAMSIZ
);
291 iwr
.u
.data
.pointer
= (caddr_t
) &iwrange
;
292 iwr
.u
.data
.length
= sizeof(iwrange
);
293 iwr
.u
.data
.flags
= 0;
295 ret
= ioctl(sock
, SIOCGIWRANGE
, &iwr
);
297 sigqual
= iwrange
.max_qual
.qual
;
306 u32
ethtool_bitrate(const char *ifname
)
308 int ret
, sock
, bitrate
;
310 struct ethtool_cmd ecmd
;
312 sock
= af_socket(AF_INET
);
314 memset(&ecmd
, 0, sizeof(ecmd
));
316 memset(&ifr
, 0, sizeof(ifr
));
317 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
319 ecmd
.cmd
= ETHTOOL_GSET
;
320 ifr
.ifr_data
= (char *) &ecmd
;
322 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
328 switch (ecmd
.speed
) {
334 bitrate
= ecmd
.speed
;
346 int ethtool_link(const char *ifname
)
350 struct ethtool_value ecmd
;
352 sock
= af_socket(AF_INET
);
354 memset(&ecmd
, 0, sizeof(ecmd
));
356 memset(&ifr
, 0, sizeof(ifr
));
357 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
359 ecmd
.cmd
= ETHTOOL_GLINK
;
360 ifr
.ifr_data
= (char *) &ecmd
;
362 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
372 int ethtool_drvinf(const char *ifname
, struct ethtool_drvinfo
*drvinf
)
377 sock
= af_socket(AF_INET
);
379 memset(drvinf
, 0, sizeof(*drvinf
));
381 memset(&ifr
, 0, sizeof(ifr
));
382 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
384 drvinf
->cmd
= ETHTOOL_GDRVINFO
;
385 ifr
.ifr_data
= (char *) drvinf
;
387 ret
= ioctl(sock
, SIOCETHTOOL
, &ifr
);
394 u32
device_bitrate(const char *ifname
)
396 u32 speed_c
, speed_w
;
398 speed_c
= ethtool_bitrate(ifname
);
399 speed_w
= wireless_bitrate(ifname
);
401 return (speed_c
== 0 ? speed_w
: speed_c
);
404 int device_ifindex(const char *ifname
)
406 int ret
, sock
, index
;
409 if (!strncmp("any", ifname
, strlen("any")))
412 sock
= af_socket(AF_INET
);
414 memset(&ifr
, 0, sizeof(ifr
));
415 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
417 ret
= ioctl(sock
, SIOCGIFINDEX
, &ifr
);
419 index
= ifr
.ifr_ifindex
;
428 static int __device_address6(const char *ifname
, struct sockaddr_storage
*ss
)
430 int ret
, family
, found
= -EINVAL
;
431 struct ifaddrs
*ifaddr
, *ifa
;
433 ret
= getifaddrs(&ifaddr
);
435 panic("Cannot get device addresses for IPv6!\n");
437 for (ifa
= ifaddr
; ifa
!= NULL
; ifa
= ifa
->ifa_next
) {
438 family
= ifa
->ifa_addr
->sa_family
;
439 if (family
!= AF_INET6
)
441 if (strcmp(ifa
->ifa_name
, ifname
))
444 memcpy(ss
, ifa
->ifa_addr
, sizeof(*ss
));
453 int device_address(const char *ifname
, int af
, struct sockaddr_storage
*ss
)
460 if (!strncmp("any", ifname
, strlen("any")))
463 return __device_address6(ifname
, ss
);
465 sock
= af_socket(af
);
467 memset(&ifr
, 0, sizeof(ifr
));
468 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
470 ifr
.ifr_addr
.sa_family
= af
;
472 ret
= ioctl(sock
, SIOCGIFADDR
, &ifr
);
474 memcpy(ss
, &ifr
.ifr_addr
, sizeof(ifr
.ifr_addr
));
481 int device_mtu(const char *ifname
)
486 sock
= af_socket(AF_INET
);
488 memset(&ifr
, 0, sizeof(ifr
));
489 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
491 ret
= ioctl(sock
, SIOCGIFMTU
, &ifr
);
502 short device_get_flags(const char *ifname
)
504 /* Really, it's short! Look at struct ifreq */
509 sock
= af_socket(AF_INET
);
511 memset(&ifr
, 0, sizeof(ifr
));
512 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
514 ret
= ioctl(sock
, SIOCGIFFLAGS
, &ifr
);
516 flags
= ifr
.ifr_flags
;
525 void device_set_flags(const char *ifname
, const short flags
)
530 sock
= af_socket(AF_INET
);
532 memset(&ifr
, 0, sizeof(ifr
));
533 strlcpy(ifr
.ifr_name
, ifname
, IFNAMSIZ
);
535 ifr
.ifr_flags
= flags
;
537 ret
= ioctl(sock
, SIOCSIFFLAGS
, &ifr
);
539 panic("Cannot set NIC flags!\n");
544 void register_signal(int signal
, void (*handler
)(int))
547 struct sigaction saction
;
549 sigfillset(&block_mask
);
551 saction
.sa_handler
= handler
;
552 saction
.sa_mask
= block_mask
;
553 saction
.sa_flags
= SA_RESTART
;
555 sigaction(signal
, &saction
, NULL
);
558 void register_signal_f(int signal
, void (*handler
)(int), int flags
)
561 struct sigaction saction
;
563 sigfillset(&block_mask
);
565 saction
.sa_handler
= handler
;
566 saction
.sa_mask
= block_mask
;
567 saction
.sa_flags
= flags
;
569 sigaction(signal
, &saction
, NULL
);
572 short enter_promiscuous_mode(char *ifname
)
576 if (!strncmp("any", ifname
, strlen("any")))
579 ifflags
= device_get_flags(ifname
);
580 device_set_flags(ifname
, ifflags
| IFF_PROMISC
);
585 void leave_promiscuous_mode(char *ifname
, short oldflags
)
587 if (!strncmp("any", ifname
, strlen("any")))
590 device_set_flags(ifname
, oldflags
);
593 int device_up_and_running(char *ifname
)
597 if (!strncmp("any", ifname
, strlen("any")))
600 return (device_get_flags(ifname
) & (IFF_UP
| IFF_RUNNING
)) == (IFF_UP
| IFF_RUNNING
);
603 void cpu_affinity(int cpu
)
606 cpu_set_t cpu_bitmask
;
608 CPU_ZERO(&cpu_bitmask
);
609 CPU_SET(cpu
, &cpu_bitmask
);
611 ret
= sched_setaffinity(getpid(), sizeof(cpu_bitmask
),
614 panic("Can't set this cpu affinity!\n");
617 int set_proc_prio(int priority
)
619 int ret
= setpriority(PRIO_PROCESS
, getpid(), priority
);
621 panic("Can't set nice val to %i!\n", priority
);
626 int set_sched_status(int policy
, int priority
)
628 int ret
, min_prio
, max_prio
;
629 struct sched_param sp
;
631 max_prio
= sched_get_priority_max(policy
);
632 min_prio
= sched_get_priority_min(policy
);
634 if (max_prio
== -1 || min_prio
== -1)
635 printf("Cannot determine scheduler prio limits!\n");
636 else if (priority
< min_prio
)
638 else if (priority
> max_prio
)
641 memset(&sp
, 0, sizeof(sp
));
642 sp
.sched_priority
= priority
;
644 ret
= sched_setscheduler(getpid(), policy
, &sp
);
646 printf("Cannot set scheduler policy!\n");
650 ret
= sched_setparam(getpid(), &sp
);
652 printf("Cannot set scheduler prio!\n");
659 int get_default_sched_policy(void)
664 int get_default_sched_prio(void)
666 return sched_get_priority_max(get_default_sched_policy());
669 int get_default_proc_prio(void)
674 void set_system_socket_memory(int *vals
, size_t len
)
678 if ((vals
[0] = get_system_socket_mem(sock_rmem_max
)) < SMEM_SUG_MAX
)
679 set_system_socket_mem(sock_rmem_max
, SMEM_SUG_MAX
);
680 if ((vals
[1] = get_system_socket_mem(sock_rmem_def
)) < SMEM_SUG_DEF
)
681 set_system_socket_mem(sock_rmem_def
, SMEM_SUG_DEF
);
682 if ((vals
[2] = get_system_socket_mem(sock_wmem_max
)) < SMEM_SUG_MAX
)
683 set_system_socket_mem(sock_wmem_max
, SMEM_SUG_MAX
);
684 if ((vals
[3] = get_system_socket_mem(sock_wmem_def
)) < SMEM_SUG_DEF
)
685 set_system_socket_mem(sock_wmem_def
, SMEM_SUG_DEF
);
688 void reset_system_socket_memory(int *vals
, size_t len
)
692 set_system_socket_mem(sock_rmem_max
, vals
[0]);
693 set_system_socket_mem(sock_rmem_def
, vals
[1]);
694 set_system_socket_mem(sock_wmem_max
, vals
[2]);
695 set_system_socket_mem(sock_wmem_def
, vals
[3]);
698 void set_itimer_interval_value(struct itimerval
*itimer
, unsigned long sec
,
701 itimer
->it_interval
.tv_sec
= sec
;
702 itimer
->it_interval
.tv_usec
= usec
;
704 itimer
->it_value
.tv_sec
= sec
;
705 itimer
->it_value
.tv_usec
= usec
;