Update of /cvsroot/pure-data/externals/OSCx/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19313
Modified Files: htmsocket.c htmsocket.h sendOSC.c Log Message: checked in patch from tracker 1656382 to fix TTL for non-multicast
Index: htmsocket.h =================================================================== RCS file: /cvsroot/pure-data/externals/OSCx/src/htmsocket.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** htmsocket.h 2 Jan 2007 01:38:20 -0000 1.4 --- htmsocket.h 14 Jun 2007 15:05:13 -0000 1.5 *************** *** 39,43 **** /* open a socket for HTM communication to given host on given portnumber */ /* if host is 0 then UNIX protocol is used (i.e. local communication) */ ! void *OpenHTMSocket(char *host, int portnumber, unsigned char multicast_TTL);
/* send a buffer of data over htm socket, returns TRUE on success. --- 39,43 ---- /* open a socket for HTM communication to given host on given portnumber */ /* if host is 0 then UNIX protocol is used (i.e. local communication) */ ! void *OpenHTMSocket(char *host, int portnumber, short *multicast_TTL);
/* send a buffer of data over htm socket, returns TRUE on success.
Index: htmsocket.c =================================================================== RCS file: /cvsroot/pure-data/externals/OSCx/src/htmsocket.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** htmsocket.c 17 Jan 2007 15:38:05 -0000 1.7 --- htmsocket.c 14 Jun 2007 15:05:13 -0000 1.8 *************** *** 104,110 **** } desc;
/* open a socket for HTM communication to given host on given portnumber */ /* if host is 0 then UNIX protocol is used (i.e. local communication */ ! void *OpenHTMSocket(char *host, int portnumber, unsigned char multicast_TTL) { struct sockaddr_in cl_addr; --- 104,130 ---- } desc;
+ int IsAddressMulticast(unsigned long address) + { + unsigned long adr = ntohl(address); + unsigned char A = (unsigned char)((adr & 0xFF000000) >> 24); + unsigned char B = (unsigned char)((adr & 0xFF0000) >> 16); + unsigned char C = (unsigned char)((adr & 0xFF00) >> 8); + + if (A==224 && B==0 && C==0) { + // This multicast group range is reserved for routing + // information and not meant to be used by applications. + return -1; + } + + // This is the multicast group IP range + if (A>=224 && A<=239) + return 1; + + return 0; + } + /* open a socket for HTM communication to given host on given portnumber */ /* if host is 0 then UNIX protocol is used (i.e. local communication */ ! void *OpenHTMSocket(char *host, int portnumber, short *multicast_TTL) { struct sockaddr_in cl_addr; *************** *** 234,247 **** }
! // set multicast Time-To-Live: ss ! if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &multicast_TTL, sizeof(multicast_TTL)) == -1) { ! perror("setsockopt TTL"); ! }
! if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) { ! perror("could not bind\n"); ! closesocket(sockfd); ! sockfd = -1; ! } } else { perror("unable to make socket\n");} --- 254,288 ---- }
! // check if specified address is a multicast group: ss 2007 ! int multicast = IsAddressMulticast(o->serv_addr.sin_addr.s_addr);
! if (multicast == -1) { ! perror("Multicast group range 224.0.0.[0-255] is reserved.\n"); ! *multicast_TTL = -2; ! close(sockfd); ! sockfd = -1; ! } ! else { ! // set TTL according to whether we have a multicast group or not ! if (multicast) { ! if (*multicast_TTL<0) ! *multicast_TTL = 1; ! } else ! *multicast_TTL = -1; ! ! // set multicast Time-To-Live only if it is a multicast group: ss 2007 ! if(*multicast_TTL>=0) { ! unsigned char ttl = (unsigned char)*multicast_TTL; ! if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, ! &ttl, sizeof(ttl)) == -1) ! perror("setsockopt TTL"); ! } ! ! if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) { ! perror("could not bind\n"); ! closesocket(sockfd); ! sockfd = -1; ! } ! } } else { perror("unable to make socket\n");} *************** *** 260,273 **** }
! // set multicast Time-To-Live: ss 2006 ! if(setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &multicast_TTL, sizeof(multicast_TTL)) == -1) { ! perror("setsockopt TTL"); ! }
! if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) { ! perror("could not bind\n"); ! close(sockfd); ! sockfd = -1; ! } } else { perror("unable to make socket\n");} --- 301,335 ---- }
! // check if specified address is a multicast group: ss 2007 ! int multicast = IsAddressMulticast(o->serv_addr.sin_addr.s_addr);
! if (multicast == -1) { ! perror("Multicast group range 224.0.0.[0-255] is reserved.\n"); ! *multicast_TTL = -2; ! close(sockfd); ! sockfd = -1; ! } ! else { ! // check if specified address is a multicast group: ss 2007 ! if (multicast) { ! if (*multicast_TTL<0) ! *multicast_TTL = 1; ! } else ! *multicast_TTL = -1; ! ! // set multicast Time-To-Live only if it is a multicast group: ss 2007 ! if(*multicast_TTL>=0) { ! unsigned char ttl = (unsigned char)*multicast_TTL; ! if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, ! &ttl, sizeof(ttl)) == -1) ! perror("setsockopt TTL"); ! } ! ! if(bind(sockfd, (struct sockaddr *) &cl_addr, sizeof(cl_addr)) < 0) { ! perror("could not bind\n"); ! close(sockfd); ! sockfd = -1; ! } ! } } else { perror("unable to make socket\n");}
Index: sendOSC.c =================================================================== RCS file: /cvsroot/pure-data/externals/OSCx/src/sendOSC.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** sendOSC.c 2 Jan 2007 01:38:20 -0000 1.8 --- sendOSC.c 14 Jun 2007 15:05:13 -0000 1.9 *************** *** 193,197 **** t_symbol *hostname; int portno = fportno; ! unsigned char ttl=1; char *protocolStr; /* create a socket */ --- 193,197 ---- t_symbol *hostname; int portno = fportno; ! short ttl=-1; char *protocolStr; /* create a socket */ *************** *** 212,216 **** if (argc >= 3) { if (argv[2].a_type==A_FLOAT) ! ttl = (unsigned char)argv[2].a_w.w_float; else return; --- 212,216 ---- if (argc >= 3) { if (argv[2].a_type==A_FLOAT) ! ttl = (short)(unsigned char)argv[2].a_w.w_float; else return; *************** *** 220,226 **** if(x->x_htmsocket == 0) { ! x->x_htmsocket = OpenHTMSocket(hostname->s_name, portno, ttl); ! if (!x->x_htmsocket) ! post("sendOSC: Couldn't open socket: "); else { --- 220,229 ---- if(x->x_htmsocket == 0) { ! x->x_htmsocket = OpenHTMSocket(hostname->s_name, portno, &ttl); ! if (!x->x_htmsocket) { ! post("sendOSC: Couldn't open socket: "); ! if (ttl==-2) ! post("sendOSC: Multicast group range 224.0.0.[0-255] is reserved.\n"); ! } else { *************** *** 237,246 **** break; } ! post("sendOSC: connected to port %s:%d (hSock=%d) protocol = %s ttl = %d", ! hostname->s_name, portno, x->x_htmsocket, protocolStr, ttl); ! outlet_float(x->x_obj.ob_outlet, 1); ! } ! } ! else perror("call to sendOSC_connect() against unavailable socket handle"); } --- 240,253 ---- break; } ! if (ttl>=0) ! post("sendOSC: connected to port %s:%d (hSock=%d) protocol = %s ttl = %d", ! hostname->s_name, portno, x->x_htmsocket, protocolStr, ttl); ! else ! post("sendOSC: connected to port %s:%d (hSock=%d) protocol = %s", ! hostname->s_name, portno, x->x_htmsocket, protocolStr); ! outlet_float(x->x_obj.ob_outlet, 1); ! } ! } ! else perror("call to sendOSC_connect() against unavailable socket handle"); }