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.
12 #include <sys/types.h>
20 int device_irq_number(const char *ifname
)
23 char buff
[128], sysname
[128];
26 if (!strncmp("lo", ifname
, strlen("lo")))
29 slprintf(sysname
, sizeof(sysname
),
30 "/sys/class/net/%s/device/irq",
33 fp
= fopen(sysname
, "r");
37 memset(buff
, 0, sizeof(buff
));
39 if (fgets(buff
, sizeof(buff
), fp
) != NULL
) {
40 buff
[sizeof(buff
) - 1] = 0;
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)
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
);
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
));
71 panic("Cannot store NIC IRQ affinity!\n");
75 nic_irq_stored
= true;
78 void device_restore_irq_affinity_list(void)
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
);
95 ret
= write(fd
, nic_irq_affinity_list
,
96 sizeof(nic_irq_affinity_list
));
98 panic("Cannot restore NIC IRQ affinity!\n");
103 int device_set_irq_affinity_list(int irq
, unsigned long from
, unsigned long to
)
106 char file
[128], list
[64];
108 if (!nic_irq_stored
) {
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
);
120 ret
= write(fd
, list
, strlen(list
));
126 int device_bind_irq_to_cpu(int irq
, int cpu
)
128 return device_set_irq_affinity_list(irq
, cpu
, cpu
);