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 void register_signal(int signal
, void (*handler
)(int))
397 struct sigaction saction
;
399 sigfillset(&block_mask
);
401 saction
.sa_handler
= handler
;
402 saction
.sa_mask
= block_mask
;
403 saction
.sa_flags
= SA_RESTART
;
405 sigaction(signal
, &saction
, NULL
);
408 void register_signal_f(int signal
, void (*handler
)(int), int flags
)
411 struct sigaction saction
;
413 sigfillset(&block_mask
);
415 saction
.sa_handler
= handler
;
416 saction
.sa_mask
= block_mask
;
417 saction
.sa_flags
= flags
;
419 sigaction(signal
, &saction
, NULL
);
422 void cpu_affinity(int cpu
)
425 cpu_set_t cpu_bitmask
;
427 CPU_ZERO(&cpu_bitmask
);
428 CPU_SET(cpu
, &cpu_bitmask
);
430 ret
= sched_setaffinity(getpid(), sizeof(cpu_bitmask
),
433 panic("Can't set this cpu affinity!\n");
436 int set_proc_prio(int priority
)
438 int ret
= setpriority(PRIO_PROCESS
, getpid(), priority
);
440 panic("Can't set nice val to %i!\n", priority
);
445 int set_sched_status(int policy
, int priority
)
447 int ret
, min_prio
, max_prio
;
448 struct sched_param sp
;
450 max_prio
= sched_get_priority_max(policy
);
451 min_prio
= sched_get_priority_min(policy
);
453 if (max_prio
== -1 || min_prio
== -1)
454 printf("Cannot determine scheduler prio limits!\n");
455 else if (priority
< min_prio
)
457 else if (priority
> max_prio
)
460 memset(&sp
, 0, sizeof(sp
));
461 sp
.sched_priority
= priority
;
463 ret
= sched_setscheduler(getpid(), policy
, &sp
);
465 printf("Cannot set scheduler policy!\n");
469 ret
= sched_setparam(getpid(), &sp
);
471 printf("Cannot set scheduler prio!\n");
478 int get_default_sched_policy(void)
483 int get_default_sched_prio(void)
485 return sched_get_priority_max(get_default_sched_policy());
488 int get_default_proc_prio(void)
493 void set_system_socket_memory(int *vals
, size_t len
)
497 if ((vals
[0] = get_system_socket_mem(sock_rmem_max
)) < SMEM_SUG_MAX
)
498 set_system_socket_mem(sock_rmem_max
, SMEM_SUG_MAX
);
499 if ((vals
[1] = get_system_socket_mem(sock_rmem_def
)) < SMEM_SUG_DEF
)
500 set_system_socket_mem(sock_rmem_def
, SMEM_SUG_DEF
);
501 if ((vals
[2] = get_system_socket_mem(sock_wmem_max
)) < SMEM_SUG_MAX
)
502 set_system_socket_mem(sock_wmem_max
, SMEM_SUG_MAX
);
503 if ((vals
[3] = get_system_socket_mem(sock_wmem_def
)) < SMEM_SUG_DEF
)
504 set_system_socket_mem(sock_wmem_def
, SMEM_SUG_DEF
);
507 void reset_system_socket_memory(int *vals
, size_t len
)
511 set_system_socket_mem(sock_rmem_max
, vals
[0]);
512 set_system_socket_mem(sock_rmem_def
, vals
[1]);
513 set_system_socket_mem(sock_wmem_max
, vals
[2]);
514 set_system_socket_mem(sock_wmem_def
, vals
[3]);
517 void set_itimer_interval_value(struct itimerval
*itimer
, unsigned long sec
,
520 itimer
->it_interval
.tv_sec
= sec
;
521 itimer
->it_interval
.tv_usec
= usec
;
523 itimer
->it_value
.tv_sec
= sec
;
524 itimer
->it_value
.tv_usec
= usec
;