aboutsummaryrefslogtreecommitdiff
path: root/promiscous~.c
diff options
context:
space:
mode:
authordieter kovacic <d13@users.sourceforge.net>2002-09-24 08:17:56 +0000
committerdieter kovacic <d13@users.sourceforge.net>2002-09-24 08:17:56 +0000
commit552ed78d7faa242b694b45dc5b78c3da87b47113 (patch)
tree3242c436c08d112664d11844d8e79026d0b7b807 /promiscous~.c
parent42da6c0e09798775a1e660eb63967af03e0bde3c (diff)
jdl AT xdv.org improved promiscous~ to listen to only one interface
svn path=/trunk/externals/ext13/; revision=151
Diffstat (limited to 'promiscous~.c')
-rw-r--r--promiscous~.c107
1 files changed, 70 insertions, 37 deletions
diff --git a/promiscous~.c b/promiscous~.c
index 1075eb7..49cc4e5 100644
--- a/promiscous~.c
+++ b/promiscous~.c
@@ -2,6 +2,7 @@
#include "ext13.h"
#include <sys/types.h>
#include <string.h>
+#include <math.h>
#include <sys/errno.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -12,6 +13,7 @@
#include <netinet/if_ether.h>
#include <netinet/ip.h>
#include <netdb.h>
+#include <linux/if_packet.h>
@@ -36,14 +38,37 @@ typedef struct _promiscous_tilde
static int setnic_promisc(char *nic_name){
int sock; // socket desc
struct ifreq f;
+ struct sockaddr_ll sll;
- if( (sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0){
+ memset(&sll, 0, sizeof(sll));
+ sll.sll_family = AF_PACKET;
+ sll.sll_protocol = htons(ETH_P_ALL);
+
+ //if( (sock = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0){
+ if( (sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0){
post("promiscous~ failed open socket, must be root (euid)");
return(-1);
}
- strcpy(f.ifr_name, nic_name);
+ //strcpy(f.ifr_name, nic_name);
+ strncpy(f.ifr_name, nic_name, sizeof(f.ifr_name));
+
+ if (ioctl(sock, SIOCGIFINDEX, &f) < 0) {
+ post ("promiscous~: error on setting if index");
+ }
+
+#ifdef DEBUG
+ post("promiscous~: ifname : %s",f.ifr_name);
+ post("promiscous~: ifindex: %d",f.ifr_ifindex);
+#endif
+
+ sll.sll_ifindex = f.ifr_ifindex;
+
+ if (bind(sock, (struct sockaddr *) &sll, sizeof(sll)) < 0) {
+ post("promiscous~: couldnt bind to interface: %s", f.ifr_name);
+ }
+
if( ioctl(sock, SIOCGIFFLAGS, &f) < 0) {
- post("promisous~ failed to get interface flags, continue anyway");
+ post("promiscous~ failed to get interface flags, continue anyway");
return(sock);
}
f.ifr_flags |= IFF_PROMISC;
@@ -56,37 +81,42 @@ static int setnic_promisc(char *nic_name){
t_int *promiscous_tilde_perform(t_int *w)
{
- t_promiscous_tilde* x = (t_promiscous_tilde*)(w[1]);
- int n = (int)(w[3]);/*number of samples*/
- int l = 0;
- int ll = 0;
- int r;
- static unsigned char packet;
- fd_set fdset;
- struct timeval timeout;
- t_float* out = (t_float *)w[2];
- int cptr[n];
-
- if (x->opened){
- timeout.tv_sec = 0;
- timeout.tv_usec = 0;
- FD_ZERO(&fdset);
- FD_SET(x->sock,&fdset);
- if (r = select(x->sock+1,&fdset,NULL,NULL,&timeout) && x->sock){
- /* l = recv(x->sock, &cptr,n, 0);*/
- l = read(x->sock, (char*) &cptr,n);
- };
- if (l < 0) l = 0;
- while (l--){
- *out++ = cptr[n-l] / 32767.;
- ll++;
- }
- }
- while (ll < n){
- *out++ = 0.;
- ll++;
- }
- return (w + 4);
+ t_promiscous_tilde* x = (t_promiscous_tilde*)(w[1]);
+ int n = (int)(w[3]);/*number of samples*/
+ int l = 0;
+ int ll = 0;
+ int r;
+ int t;
+ static unsigned char packet;
+ fd_set fdset;
+ struct timeval timeout;
+ t_float* out = (t_float *)w[2];
+ int cptr[n];
+
+ if (x->opened){
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 0;
+ FD_ZERO(&fdset);
+ FD_SET(x->sock,&fdset);
+ if (r = select(x->sock+1,&fdset,NULL,NULL,&timeout) && x->sock){
+ l = recv(x->sock, &cptr,n, 0);
+ //l = read(x->sock, (char*) &cptr,n);
+ };
+ if (l < 0) l = 0;
+ while (l--){
+ t = cptr[n-l];
+ //post("sample: %d",t);
+ //*out++ = t / 32767.;
+ *out++ = (float) t / (float) pow(2, 32);
+ ll++;
+ }
+ }
+ while (ll < n){
+ *out++ = 0.;
+ //post("sample: %f",*out);
+ ll++;
+ }
+ return (w + 4);
}
static void promiscous_tilde_dsp(t_promiscous_tilde *x, t_signal **sp)
@@ -101,12 +131,15 @@ static void promiscous_tilde_free(t_promiscous_tilde *x){
}
-static void *promiscous_tilde_new()
+static void *promiscous_tilde_new(t_symbol *ifname)
{
t_promiscous_tilde *x = (t_promiscous_tilde *)pd_new(promiscous_tilde_class);
outlet_new(&x->x_obj, gensym("signal"));
- x->interface = gensym("eth0");
+ if (*ifname->s_name)
+ x->interface = ifname;
+ else
+ x->interface = gensym(DEFAULT_NIC);
if((x->sock = setnic_promisc(x->interface->s_name))<0){
post ("could not open interface");
@@ -121,6 +154,6 @@ static void *promiscous_tilde_new()
void promiscous_tilde_setup(void)
{
promiscous_tilde_class = class_new(gensym("promiscous~"), (t_newmethod) promiscous_tilde_new, 0,
- sizeof(t_promiscous_tilde), CLASS_NOINLET, 0);
+ sizeof(t_promiscous_tilde), CLASS_NOINLET, A_DEFSYM, 0);
class_addmethod(promiscous_tilde_class, (t_method) promiscous_tilde_dsp, gensym("dsp"), 0);
}