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>
21 int device_irq_number(const char *ifname
)
24 char buff
[128], sysname
[128];
27 if (!strncmp("lo", ifname
, strlen("lo")))
30 slprintf(sysname
, sizeof(sysname
),
31 "/sys/class/net/%s/device/irq",
34 fp
= fopen(sysname
, "r");
38 memset(buff
, 0, sizeof(buff
));
40 if (fgets(buff
, sizeof(buff
), fp
) != NULL
) {
41 buff
[sizeof(buff
) - 1] = 0;
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)
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
);
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
));
72 panic("Cannot store NIC IRQ affinity!\n");
76 nic_irq_stored
= true;
79 void device_restore_irq_affinity_list(void)
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
);
96 ret
= write(fd
, nic_irq_affinity_list
,
97 sizeof(nic_irq_affinity_list
));
99 panic("Cannot restore NIC IRQ affinity!\n");
104 int device_set_irq_affinity_list(int irq
, unsigned long from
, unsigned long to
)
107 char file
[128], list
[64];
109 if (!nic_irq_stored
) {
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
);
121 ret
= write(fd
, list
, strlen(list
));
127 int device_bind_irq_to_cpu(int irq
, int cpu
)
129 return device_set_irq_affinity_list(irq
, cpu
, cpu
);