irq: break out from xutils and save + restore
[netsniff-ng.git] / irq.c
blobfbd1cbc48fa4656faf29a654066812be6d1b7caa
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 "die.h"
18 #include "xutils.h"
20 int device_irq_number(const char *ifname)
22 int irq = 0;
23 char buff[128], sysname[128];
24 FILE *fp;
26 if (!strncmp("lo", ifname, strlen("lo")))
27 return 0;
29 slprintf(sysname, sizeof(sysname),
30 "/sys/class/net/%s/device/irq",
31 ifname);
33 fp = fopen(sysname, "r");
34 if (!fp)
35 return -ENOENT;
37 memset(buff, 0, sizeof(buff));
39 if (fgets(buff, sizeof(buff), fp) != NULL) {
40 buff[sizeof(buff) - 1] = 0;
41 irq = atoi(buff);
44 fclose(fp);
45 return irq;
48 static char nic_irq_affinity_list[128];
49 static bool nic_irq_stored = false;
50 static int nic_irq = -1;
52 static void device_save_irq_affinity_list(void)
54 int ret, fd;
55 char file[128];
57 bug_on(nic_irq_stored);
59 slprintf(file, sizeof(file),
60 "/proc/irq/%d/smp_affinity_list", nic_irq);
62 fd = open(file, O_RDONLY);
63 if (fd < 0)
64 return;
66 memset(nic_irq_affinity_list, 0, sizeof(nic_irq_affinity_list));
68 ret = read(fd, nic_irq_affinity_list,
69 sizeof(nic_irq_affinity_list));
70 if (ret < 0)
71 panic("Cannot store NIC IRQ affinity!\n");
73 close(fd);
75 nic_irq_stored = true;
78 void device_restore_irq_affinity_list(void)
80 int ret, fd;
81 char file[128];
83 if (!nic_irq_stored)
84 return;
86 bug_on(nic_irq == -1);
88 slprintf(file, sizeof(file),
89 "/proc/irq/%d/smp_affinity_list", nic_irq);
91 fd = open(file, O_WRONLY);
92 if (fd < 0)
93 return;
95 ret = write(fd, nic_irq_affinity_list,
96 sizeof(nic_irq_affinity_list));
97 if (ret < 0)
98 panic("Cannot restore NIC IRQ affinity!\n");
100 close(fd);
103 int device_set_irq_affinity_list(int irq, unsigned long from, unsigned long to)
105 int ret, fd;
106 char file[128], list[64];
108 if (!nic_irq_stored) {
109 nic_irq = irq;
110 device_save_irq_affinity_list();
113 slprintf(file, sizeof(file), "/proc/irq/%d/smp_affinity_list", irq);
114 slprintf(list, sizeof(list), "%lu-%lu\n", from, to);
116 fd = open(file, O_WRONLY);
117 if (fd < 0)
118 return -ENOENT;
120 ret = write(fd, list, strlen(list));
122 close(fd);
123 return ret;
126 int device_bind_irq_to_cpu(int irq, int cpu)
128 return device_set_irq_affinity_list(irq, cpu, cpu);