From: Fredrik Tolf Date: Sat, 9 Aug 2008 20:28:46 +0000 (+0200) Subject: Drop looped packets. X-Git-Url: http://git.dolda2000.com/gitweb/?a=commitdiff_plain;h=b62b996ecc97dd059524a88a2aaf3a33222af4b0;p=mctap.git Drop looped packets. --- diff --git a/src/mctap.c b/src/mctap.c index 9d183f9..24efc12 100644 --- a/src/mctap.c +++ b/src/mctap.c @@ -17,6 +17,7 @@ #include "utils.h" static int quit = 0; +static unsigned char macaddr[6]; static void usage(FILE *out) { @@ -145,6 +146,8 @@ static void bridge(int sock, int tap, struct sockaddr *dst, socklen_t dstlen) } else { if(sizeof(buf) - ret < sizeof(pi)) { /* Drop */ + } else if((ret < 12) || !memcmp(macaddr, buf + 6, 6)) { + /* Drop looped back */ } else { memmove(buf + sizeof(pi), buf, ret); pi.flags = 0; @@ -189,6 +192,9 @@ static int maketap(char *name) strncpy(rb.ifr_name, name, IFNAMSIZ); if(ioctl(fd, TUNSETIFF, &rb)) return(-1); + if(ioctl(fd, SIOCGIFHWADDR, &rb)) + return(-1); + memcpy(macaddr, rb.ifr_hwaddr.sa_data, 6); return(fd); } @@ -308,6 +314,7 @@ int main(int argc, char **argv) dst.sin_family = AF_INET; dst.sin_addr = group; dst.sin_port = htons(port); + syslog(LOG_INFO, "bridge created with MAC %02x:%02x:%02x:%02x:%02x:%02x", macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]); bridge(sock, tap, (struct sockaddr *)&dst, sizeof(dst)); syslog(LOG_INFO, "exiting");