From: Daniel Borkmann Date: Tue, 29 Jan 2013 14:20:37 +0000 (+0100) Subject: xutils: put commonly used code into xutils, remove deprecated one X-Git-Url: https://repo.or.cz/w/netsniff-ng.git/commitdiff_plain/17941f38d3956ad00a90b8682055c8af2a6319b1 xutils: put commonly used code into xutils, remove deprecated one Signed-off-by: Daniel Borkmann --- diff --git a/netsniff-ng.c b/netsniff-ng.c index 3004c33f..b711097d 100644 --- a/netsniff-ng.c +++ b/netsniff-ng.c @@ -69,7 +69,7 @@ volatile sig_atomic_t sigint = 0; static volatile bool next_dump = false; -static const char *short_options = "d:i:o:rf:MJt:S:k:n:b:B:HQmcsqXlvhF:RGAP:Vu:g:T:D"; +static const char *short_options = "d:i:o:rf:MJt:S:k:n:b:HQmcsqXlvhF:RGAP:Vu:g:T:D"; static const struct option long_options[] = { {"dev", required_argument, NULL, 'd'}, {"in", required_argument, NULL, 'i'}, @@ -81,7 +81,6 @@ static const struct option long_options[] = { {"ring-size", required_argument, NULL, 'S'}, {"kernel-pull", required_argument, NULL, 'k'}, {"bind-cpu", required_argument, NULL, 'b'}, - {"unbind-cpu", required_argument, NULL, 'B'}, {"prefix", required_argument, NULL, 'P'}, {"user", required_argument, NULL, 'u'}, {"group", required_argument, NULL, 'g'}, @@ -113,26 +112,6 @@ static struct itimerval itimer; static unsigned long frame_count_max = 0, interval = TX_KERNEL_PULL_INT; -#define set_system_socket_memory(vals) \ - do { \ - if ((vals[0] = get_system_socket_mem(sock_rmem_max)) < SMEM_SUG_MAX) \ - set_system_socket_mem(sock_rmem_max, SMEM_SUG_MAX); \ - if ((vals[1] = get_system_socket_mem(sock_rmem_def)) < SMEM_SUG_DEF) \ - set_system_socket_mem(sock_rmem_def, SMEM_SUG_DEF); \ - if ((vals[2] = get_system_socket_mem(sock_wmem_max)) < SMEM_SUG_MAX) \ - set_system_socket_mem(sock_wmem_max, SMEM_SUG_MAX); \ - if ((vals[3] = get_system_socket_mem(sock_wmem_def)) < SMEM_SUG_DEF) \ - set_system_socket_mem(sock_wmem_def, SMEM_SUG_DEF); \ - } while (0) - -#define reset_system_socket_memory(vals) \ - do { \ - set_system_socket_mem(sock_rmem_max, vals[0]); \ - set_system_socket_mem(sock_rmem_def, vals[1]); \ - set_system_socket_mem(sock_wmem_max, vals[2]); \ - set_system_socket_mem(sock_wmem_def, vals[3]); \ - } while (0) - #define __pcap_io pcap_ops[ctx->pcap] static void signal_handler(int number) @@ -1117,7 +1096,7 @@ static void header(void) int main(int argc, char **argv) { char *ptr; - int c, i, j, opt_index, ops_touched = 0, vals[4] = {0}; + int c, i, j, cpu_tmp, opt_index, ops_touched = 0, vals[4] = {0}; bool prio_high = false, setsockmem = true; void (*main_loop)(struct ctx *ctx) = NULL; struct ctx ctx = { @@ -1218,13 +1197,11 @@ int main(int argc, char **argv) ctx.reserve_size *= strtol(optarg, NULL, 0); break; case 'b': - set_cpu_affinity(optarg, 0); - /* Take the first CPU for rebinding the IRQ */ + cpu_tmp = strtol(optarg, NULL, 0); + + cpu_affinity(cpu_tmp); if (ctx.cpu != -2) - ctx.cpu = strtol(optarg, NULL, 0); - break; - case 'B': - set_cpu_affinity(optarg, 1); + ctx.cpu = cpu_tmp; break; case 'H': prio_high = true; @@ -1333,7 +1310,6 @@ int main(int argc, char **argv) case 'T': case 'u': case 'g': - case 'B': case 'e': panic("Option -%c requires an argument!\n", optopt); @@ -1411,14 +1387,14 @@ int main(int argc, char **argv) bug_on(!main_loop); if (setsockmem) - set_system_socket_memory(vals); + set_system_socket_memory(vals, array_size(vals)); xlockme(); main_loop(&ctx); xunlockme(); if (setsockmem) - reset_system_socket_memory(vals); + reset_system_socket_memory(vals, array_size(vals)); tprintf_cleanup(); diff --git a/trafgen.c b/trafgen.c index 2d3a3998..b18201c7 100644 --- a/trafgen.c +++ b/trafgen.c @@ -122,26 +122,6 @@ unsigned int seed; #define CPU_STATS_STATE_CHK 2 #define CPU_STATS_STATE_RES 4 -#define set_system_socket_memory(vals) \ - do { \ - if ((vals[0] = get_system_socket_mem(sock_rmem_max)) < SMEM_SUG_MAX) \ - set_system_socket_mem(sock_rmem_max, SMEM_SUG_MAX); \ - if ((vals[1] = get_system_socket_mem(sock_rmem_def)) < SMEM_SUG_DEF) \ - set_system_socket_mem(sock_rmem_def, SMEM_SUG_DEF); \ - if ((vals[2] = get_system_socket_mem(sock_wmem_max)) < SMEM_SUG_MAX) \ - set_system_socket_mem(sock_wmem_max, SMEM_SUG_MAX); \ - if ((vals[3] = get_system_socket_mem(sock_wmem_def)) < SMEM_SUG_DEF) \ - set_system_socket_mem(sock_wmem_def, SMEM_SUG_DEF); \ - } while (0) - -#define reset_system_socket_memory(vals) \ - do { \ - set_system_socket_mem(sock_rmem_max, vals[0]); \ - set_system_socket_mem(sock_rmem_def, vals[1]); \ - set_system_socket_mem(sock_wmem_max, vals[2]); \ - set_system_socket_mem(sock_wmem_def, vals[3]); \ - } while (0) - #ifndef ICMP_FILTER # define ICMP_FILTER 1 @@ -1185,7 +1165,7 @@ int main(int argc, char **argv) header(); - set_system_socket_memory(vals); + set_system_socket_memory(vals, array_size(vals)); xlockme(); if (ctx.rfraw) { @@ -1233,7 +1213,7 @@ int main(int argc, char **argv) if (ctx.rfraw) leave_rfmon_mac80211(ctx.device_trans, ctx.device); - reset_system_socket_memory(vals); + reset_system_socket_memory(vals, array_size(vals)); for (i = 0, tx_packets = tx_bytes = 0; i < ctx.cpus; i++) { while ((__get_state(i) & CPU_STATS_STATE_RES) == 0) diff --git a/xutils.c b/xutils.c index 47f33e82..4e97b06e 100644 --- a/xutils.c +++ b/xutils.c @@ -33,11 +33,9 @@ #include #include #include -/* Kernel < 2.6.26 */ #include #include #include -/* Kernel < 2.6.26 */ #include #include #include @@ -65,8 +63,21 @@ enum { ioprio_who_user, }; +enum { + sock_rmem_max = 0, + sock_rmem_def, + sock_wmem_max, + sock_wmem_def, +}; + +#define SMEM_SUG_MAX 104857600 +#define SMEM_SUG_DEF 4194304 + static const char *const to_prio[] = { - "none", "realtime", "best-effort", "idle", + "none", + "realtime", + "best-effort", + "idle", }; static const char *const sock_mem[] = { @@ -713,20 +724,16 @@ void sock_print_net_stats(int sock, unsigned long skipped) socklen_t slen = sizeof(kstats); memset(&kstats, 0, sizeof(kstats)); - ret = getsockopt(sock, SOL_PACKET, PACKET_STATISTICS, &kstats, &slen); if (ret > -1) { uint64_t packets = kstats.tp_packets; uint64_t drops = kstats.tp_drops; printf("\r%12ld packets incoming\n", packets); - printf("\r%12ld packets passed filter\n", - packets - drops - skipped); - printf("\r%12ld packets failed filter (out of space)\n", - drops + skipped); + printf("\r%12ld packets passed filter\n", packets - drops - skipped); + printf("\r%12ld packets failed filter (out of space)\n", drops + skipped); if (kstats.tp_packets > 0) - printf("\r%12.4f%\% packet droprate\n", - 1.f * drops / packets * 100.f); + printf("\r%12.4lf%\% packet droprate\n", (1.0 * drops / packets) * 100.0); } } @@ -740,6 +747,7 @@ void register_signal(int signal, void (*handler)(int)) saction.sa_handler = handler; saction.sa_mask = block_mask; saction.sa_flags = SA_RESTART; + sigaction(signal, &saction, NULL); } @@ -753,6 +761,7 @@ void register_signal_f(int signal, void (*handler)(int), int flags) saction.sa_handler = handler; saction.sa_mask = block_mask; saction.sa_flags = flags; + sigaction(signal, &saction, NULL); } @@ -760,12 +769,12 @@ int get_tty_size(void) { #ifdef TIOCGSIZE struct ttysize ts = {0}; - return (ioctl(0, TIOCGSIZE, &ts) == 0 ? - ts.ts_cols : DEFAULT_TTY_SIZE); + + return (ioctl(0, TIOCGSIZE, &ts) == 0 ? ts.ts_cols : DEFAULT_TTY_SIZE); #elif defined(TIOCGWINSZ) struct winsize ts; - return (ioctl(0, TIOCGWINSZ, &ts) == 0 ? - ts.ws_col : DEFAULT_TTY_SIZE); + + return (ioctl(0, TIOCGWINSZ, &ts) == 0 ? ts.ws_col : DEFAULT_TTY_SIZE); #else return DEFAULT_TTY_SIZE; #endif @@ -819,8 +828,7 @@ int device_up_and_running(char *ifname) if (!strncmp("any", ifname, strlen("any"))) return 1; - return (device_get_flags(ifname) & (IFF_UP | IFF_RUNNING)) == - (IFF_UP | IFF_RUNNING); + return (device_get_flags(ifname) & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING); } int poll_error_maybe_die(int sock, struct pollfd *pfd) @@ -841,7 +849,7 @@ int poll_error_maybe_die(int sock, struct pollfd *pfd) return POLL_MOVE_OUT; } if (pfd->revents & POLLNVAL) { - whine("Invalid polling request on socket!\n"); + printf("Invalid polling request on socket!\n"); return POLL_MOVE_OUT; } @@ -849,21 +857,6 @@ int poll_error_maybe_die(int sock, struct pollfd *pfd) return POLL_NEXT_PKT; } -static inline char *next_token(char *q, int sep) -{ - if (q) - q = strchr(q, sep); - /* - * glibc defines this as a macro and gcc throws a false - * positive ``logical ‘&&’ with non-zero constant will - * always evaluate as true'' in older versions. See: - * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36513 - */ - if (q) - q++; - return q; -} - void cpu_affinity(int cpu) { int ret; @@ -878,73 +871,8 @@ void cpu_affinity(int cpu) panic("Can't set this cpu affinity!\n"); } -int set_cpu_affinity(char *str, int inverted) -{ - int ret, i, cpus; - char *p, *q; - cpu_set_t cpu_bitmask; - - q = str; - - cpus = get_number_cpus(); - - CPU_ZERO(&cpu_bitmask); - - for (i = 0; inverted && i < cpus; ++i) - CPU_SET(i, &cpu_bitmask); - - while (p = q, q = next_token(q, ','), p) { - unsigned int a; /* Beginning of range */ - unsigned int b; /* End of range */ - unsigned int s; /* Stride */ - char *c1, *c2; - - if (sscanf(p, "%u", &a) < 1) - return -EINVAL; - - b = a; - s = 1; - - c1 = next_token(p, '-'); - c2 = next_token(p, ','); - - if (c1 != NULL && (c2 == NULL || c1 < c2)) { - if (sscanf(c1, "%u", &b) < 1) - return -EINVAL; - - c1 = next_token(c1, ':'); - - if (c1 != NULL && (c2 == NULL || c1 < c2)) - if (sscanf(c1, "%u", &s) < 1) - return -EINVAL; - } - - if (!(a <= b)) - return -EINVAL; - - while (a <= b) { - if (inverted) - CPU_CLR(a, &cpu_bitmask); - else - CPU_SET(a, &cpu_bitmask); - a += s; - } - } - - ret = sched_setaffinity(getpid(), sizeof(cpu_bitmask), - &cpu_bitmask); - if (ret) - panic("Can't set this cpu affinity!\n"); - - return 0; -} - int set_proc_prio(int priority) { - /* - * setpriority() is clever, even if you put a nice value which - * is out of range it corrects it to the closest valid nice value - */ int ret = setpriority(PRIO_PROCESS, getpid(), priority); if (ret) panic("Can't set nice val to %i!\n", priority); @@ -1117,27 +1045,6 @@ noinline void *xmemset(void *s, int c, size_t n) return ptr; } -char *getuint(char *in, uint32_t *out) -{ - char *pt = in, tmp; - char *endptr = NULL; - - while (*in && (isdigit(*in) || isxdigit(*in) || *in == 'x')) - in++; - if (!*in) - panic("Syntax error!\n"); - errno = 0; - tmp = *in; - *in = 0; - *out = strtoul(pt, &endptr, 0); - if ((endptr != NULL && *endptr != '\0') || errno != 0) { - panic("Syntax error!\n"); - } - *in = tmp; - - return in; -} - char *strtrim_right(register char *p, register char c) { register char *end; @@ -1156,7 +1063,7 @@ char *strtrim_right(register char *p, register char c) return p; } -char *strtrim_left(register char *p, register char c) +static char *strtrim_left(register char *p, register char c) { register int len; @@ -1170,3 +1077,78 @@ char *strtrim_left(register char *p, register char c) return p; } + +char *skips(char *p) +{ + return strtrim_left(p, ' '); +} + +int get_default_sched_policy(void) +{ + return SCHED_FIFO; +} + +int get_default_sched_prio(void) +{ + return sched_get_priority_max(get_default_sched_policy()); +} + +int get_number_cpus(void) +{ + return sysconf(_SC_NPROCESSORS_CONF); +} + +int get_number_cpus_online(void) +{ + return sysconf(_SC_NPROCESSORS_ONLN); +} + +int get_default_proc_prio(void) +{ + return -20; +} + +struct timeval tv_subtract(struct timeval time1, struct timeval time2) +{ + struct timeval result; + + if ((time1.tv_sec < time2.tv_sec) || ((time1.tv_sec == time2.tv_sec) && + (time1.tv_usec <= time2.tv_usec))) { + result.tv_sec = result.tv_usec = 0; + } else { + result.tv_sec = time1.tv_sec - time2.tv_sec; + if (time1.tv_usec < time2.tv_usec) { + result.tv_usec = time1.tv_usec + 1000000L - + time2.tv_usec; + result.tv_sec--; + } else { + result.tv_usec = time1.tv_usec - time2.tv_usec; + } + } + + return result; +} + +void set_system_socket_memory(int *vals, size_t len) +{ + bug_on(len != 4); + + if ((vals[0] = get_system_socket_mem(sock_rmem_max)) < SMEM_SUG_MAX) + set_system_socket_mem(sock_rmem_max, SMEM_SUG_MAX); + if ((vals[1] = get_system_socket_mem(sock_rmem_def)) < SMEM_SUG_DEF) + set_system_socket_mem(sock_rmem_def, SMEM_SUG_DEF); + if ((vals[2] = get_system_socket_mem(sock_wmem_max)) < SMEM_SUG_MAX) + set_system_socket_mem(sock_wmem_max, SMEM_SUG_MAX); + if ((vals[3] = get_system_socket_mem(sock_wmem_def)) < SMEM_SUG_DEF) + set_system_socket_mem(sock_wmem_def, SMEM_SUG_DEF); +} + +void reset_system_socket_memory(int *vals, size_t len) +{ + bug_on(len != 4); + + set_system_socket_mem(sock_rmem_max, vals[0]); + set_system_socket_mem(sock_rmem_def, vals[1]); + set_system_socket_mem(sock_wmem_max, vals[2]); + set_system_socket_mem(sock_wmem_def, vals[3]); +} diff --git a/xutils.h b/xutils.h index 21a547e0..309a1969 100644 --- a/xutils.h +++ b/xutils.h @@ -24,19 +24,8 @@ #include #include -#include "die.h" #include "built_in.h" -enum { - sock_rmem_max = 0, - sock_rmem_def, - sock_wmem_max, - sock_wmem_def, -}; - -#define SMEM_SUG_MAX 104857600 -#define SMEM_SUG_DEF 4194304 - extern int af_socket(int af); extern int pf_socket(void); extern int adjust_dbm_level(int in_dbm, int dbm_val); @@ -48,11 +37,9 @@ extern u32 device_bitrate(const char *ifname); extern int ethtool_drvinf(const char *ifname, struct ethtool_drvinfo *drvinf); extern int ethtool_link(const char *ifname); extern int device_mtu(const char *ifname); -extern int device_address(const char *ifname, int af, - struct sockaddr_storage *ss); +extern int device_address(const char *ifname, int af, struct sockaddr_storage *ss); extern int device_irq_number(const char *ifname); -extern int device_set_irq_affinity_list(int irq, unsigned long from, - unsigned long to); +extern int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to); extern int device_bind_irq_to_cpu(int irq, int cpu); extern void sock_print_net_stats(int sock, unsigned long skipped); extern int device_ifindex(const char *ifname); @@ -86,10 +73,8 @@ extern int device_up(char *ifname); extern int device_running(char *ifname); extern int device_up_and_running(char *ifname); extern int poll_error_maybe_die(int sock, struct pollfd *pfd); -extern void set_epoll_descriptor(int fd_epoll, int action, - int fd_toadd, int events); -extern int set_epoll_descriptor2(int fd_epoll, int action, - int fd_toadd, int events); +extern void set_epoll_descriptor(int fd_epoll, int action, int fd_toadd, int events); +extern int set_epoll_descriptor2(int fd_epoll, int action, int fd_toadd, int events); extern void cpu_affinity(int cpu); extern int set_cpu_affinity(char *str, int inverted); extern int set_proc_prio(int prio); @@ -105,68 +90,15 @@ extern size_t strlcpy(char *dest, const char *src, size_t size); extern int slprintf(char *dst, size_t size, const char *fmt, ...) __check_format_printf(3, 4); extern int slprintf_nocheck(char *dst, size_t size, const char *fmt, ...); extern noinline void *xmemset(void *s, int c, size_t n); -extern char *getuint(char *in, uint32_t *out); extern char *strtrim_right(register char *p, register char c); -extern char *strtrim_left(register char *p, register char c); - -static inline int get_default_sched_policy(void) -{ - return SCHED_FIFO; -} - -static inline int get_default_sched_prio(void) -{ - return sched_get_priority_max(get_default_sched_policy()); -} - -static inline int get_number_cpus(void) -{ - return sysconf(_SC_NPROCESSORS_CONF); -} - -static inline int get_number_cpus_online(void) -{ - return sysconf(_SC_NPROCESSORS_ONLN); -} - -static inline int get_default_proc_prio(void) -{ - return -20; -} - -static inline struct timeval tv_subtract(struct timeval time1, - struct timeval time2) -{ - /* time1 - time2 */ - struct timeval result; - - if ((time1.tv_sec < time2.tv_sec) || ((time1.tv_sec == time2.tv_sec) && - (time1.tv_usec <= time2.tv_usec))) { - result.tv_sec = result.tv_usec = 0; - } else { - result.tv_sec = time1.tv_sec - time2.tv_sec; - if (time1.tv_usec < time2.tv_usec) { - result.tv_usec = time1.tv_usec + 1000000L - - time2.tv_usec; - result.tv_sec--; - } else { - result.tv_usec = time1.tv_usec - time2.tv_usec; - } - } - - return result; -} - -static inline char *skips(char *p) -{ - return strtrim_left(p, ' '); -} - -static inline char *skipchar(char *in, char c) -{ - if (*in != c) - panic("Syntax error!\n"); - return ++in; -} +extern char *skips(char *p); +extern int get_default_sched_policy(void); +extern int get_default_sched_prio(void); +extern int get_number_cpus(void); +extern int get_number_cpus_online(void); +extern int get_default_proc_prio(void); +extern void set_system_socket_memory(int *vals, size_t len); +extern void reset_system_socket_memory(int *vals, size_t len); +extern struct timeval tv_subtract(struct timeval time1, struct timeval time2); #endif /* XSYS_H */