xutils: remove unused declaration
[netsniff-ng.git] / irq.c
blobfc2427bd0fa061689205035ca27c28ba98f8d9b2
1 /*
2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009 - 2013 Daniel Borkmann.
4 * Copyright 2009, 2010 Emmanuel Roullit.
5 * Subject to the GPL, version 2.
6 */
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include <errno.h>
12 #include <sys/types.h>
13 #include <sys/stat.h>
14 #include <fcntl.h>
16 #include "irq.h"
17 #include "str.h"
18 #include "die.h"
19 #include "xutils.h"
21 int device_irq_number(const char *ifname)
23 int irq = 0;
24 char buff[128], sysname[128];
25 FILE *fp;
27 if (!strncmp("lo", ifname, strlen("lo")))
28 return 0;
30 slprintf(sysname, sizeof(sysname),
31 "/sys/class/net/%s/device/irq",
32 ifname);
34 fp = fopen(sysname, "r");
35 if (!fp)
36 return -ENOENT;
38 memset(buff, 0, sizeof(buff));
40 if (fgets(buff, sizeof(buff), fp) != NULL) {
41 buff[sizeof(buff) - 1] = 0;
42 irq = atoi(buff);
45 fclose(fp);
46 return irq;
49 static char nic_irq_affinity_list[128];
50 static bool nic_irq_stored = false;
51 static int nic_irq = -1;
53 static void device_save_irq_affinity_list(void)
55 int ret, fd;
56 char file[128];
58 bug_on(nic_irq_stored);
60 slprintf(file, sizeof(file),
61 "/proc/irq/%d/smp_affinity_list", nic_irq);
63 fd = open(file, O_RDONLY);
64 if (fd < 0)
65 return;
67 memset(nic_irq_affinity_list, 0, sizeof(nic_irq_affinity_list));
69 ret = read(fd, nic_irq_affinity_list,
70 sizeof(nic_irq_affinity_list));
71 if (ret < 0)
72 panic("Cannot store NIC IRQ affinity!\n");
74 close(fd);
76 nic_irq_stored = true;
79 void device_restore_irq_affinity_list(void)
81 int ret, fd;
82 char file[128];
84 if (!nic_irq_stored)
85 return;
87 bug_on(nic_irq == -1);
89 slprintf(file, sizeof(file),
90 "/proc/irq/%d/smp_affinity_list", nic_irq);
92 fd = open(file, O_WRONLY);
93 if (fd < 0)
94 return;
96 ret = write(fd, nic_irq_affinity_list,
97 sizeof(nic_irq_affinity_list));
98 if (ret < 0)
99 panic("Cannot restore NIC IRQ affinity!\n");
101 close(fd);
104 int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to)
106 int ret, fd;
107 char file[128], list[64];
109 if (!nic_irq_stored) {
110 nic_irq = irq;
111 device_save_irq_affinity_list();
114 slprintf(file, sizeof(file), "/proc/irq/%d/smp_affinity_list", irq);
115 slprintf(list, sizeof(list), "%lu-%lu\n", from, to);
117 fd = open(file, O_WRONLY);
118 if (fd < 0)
119 return -ENOENT;
121 ret = write(fd, list, strlen(list));
123 close(fd);
124 return ret;
127 int device_bind_irq_to_cpu(int irq, int cpu)
129 return device_set_irq_affinity_list(irq, cpu, cpu);