From owner-freebsd-stable@FreeBSD.ORG Fri May 7 06:59:52 2004 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0F7A816A4CE for ; Fri, 7 May 2004 06:59:52 -0700 (PDT) Received: from vnode.vmunix.com (vnode.vmunix.com [64.7.135.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id EBFFA43D2D for ; Fri, 7 May 2004 06:59:50 -0700 (PDT) (envelope-from gabor@vmunix.com) Received: by vnode.vmunix.com (Postfix, from userid 1004) id 9660EA19DE; Fri, 7 May 2004 13:59:48 +0000 (GMT) Date: Fri, 7 May 2004 09:59:48 -0400 From: Gabor To: freebsd-stable@freebsd.org Message-ID: <20040507135948.GA5726@vmunix.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.1i X-Operating-System: FreeBSD 4.9-RC Subject: routing bug? X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 07 May 2004 13:59:52 -0000 I am experiencing some weird routing phenomena. When I open a UDP socket and send datagrams to an address(172.30.1.1) and then remove that route(route delete 172.30.1.1) then my packets switch from going out the route specific interface(rl0) to going out the default interface(fxp0). This is as expected. Then I add back the route (route add 172.30.1.1 10.0.2.2) and the packets swing back to the route specific interface(rl0). However, if I bind my socket to a source address(172.16.24.33), when I remove the route and then add it back, the packets continue to go out the default interface(fxp0) instead of going out the route specific interface(rl0). This is on 4.9 STABLE. I was unable to reproduce this on 5.2.1. What changes have there been that haven't been MFC'ed? =0= udp-test # netstat -nr Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.43.1 UGSc 2 2440 fxp0 10.0.2/24 link#1 UC 2 0 rl0 10.0.2.1 00:50:fc:32:52:a7 UHLW 0 2 lo0 10.0.2.2 00:0e:0c:05:09:19 UHLW 1 3 rl0 69 172.0.0.1 172.0.0.1 UH 0 0 lo0 172.30.1.1 10.0.2.2 UGHS 0 0 rl0 192.168.7 link#1 UC 0 0 rl0 192.168.43 link#2 UC 4 0 fxp0 192.168.43.1 00:50:bf:33:63:70 UHLW 4 56111 fxp0 1079 192.168.43.31 link#2 UHLW 1 249 fxp0 192.168.43.157 00:a0:c9:4b:a5:f4 UHLW 6 2168880 fxp0 771 192.168.43.242 link#2 UHLW 1 718878 fxp0 =0= udp-test # ifconfig rl0: flags=8843 mtu 1500 inet 192.168.7.2 netmask 0xffffff00 broadcast 192.168.7.255 inet 10.0.2.1 netmask 0xffffff00 broadcast 10.0.2.255 ether 00:50:fc:32:52:a7 media: Ethernet 10baseT/UTP status: active fxp0: flags=8843 mtu 1500 inet 192.168.43.26 netmask 0xffffff00 broadcast 192.168.43.255 ether 00:01:80:3d:b4:4f media: Ethernet autoselect (100baseTX ) status: active ppp0: flags=8010 mtu 1500 faith0: flags=8002 mtu 1500 ds0: flags=8008 mtu 65532 lo0: flags=8049 mtu 16384 inet 172.16.24.33 netmask 0xffff0000 inet 172.0.0.1 netmask 0xffff0000 tun0: flags=8010 mtu 1500 =0= udp-test # cat udp-test.c #include #include #include #include #include #include #include #include #include #include int send_pkt(unsigned char *src, unsigned char *dest, unsigned short port); int main(int argc, char **argv) { unsigned a, b, c, d, a2, b2, c2, d2; unsigned port; unsigned char src[4], dest[4]; if (argc != 3) { fprintf(stderr, "Usage: %s :\n", argv[0]); return 1; } if (sscanf(argv[1], "%u.%u.%u.%u", &a, &b, &c, &d) == 4 && a < 256 && b < 256 && c < 256 && d < 256 && sscanf(argv[2], "%u.%u.%u.%u:%u", &a2, &b2, &c2, &d2, &port) == 5 && a2 < 256 && b2 < 256 && c2 < 256 && d2 < 256 && port < 65536) { /* OK */ src[0] = a; src[1] = b; src[2] = c; src[3] = d; dest[0] = a2; dest[1] = b2; dest[2] = c2; dest[3] = d2; send_pkt(src, dest, port); } else { fprintf(stderr, "Usage: %s :\n", argv[0]); return 1; } return 0; } int send_pkt(unsigned char *src, unsigned char *dest, unsigned short port) { int s, len, cnt, rc, on; struct protoent *proto; struct sockaddr_in to, from; char data[1024]; if (!(proto = getprotobyname("udp"))) { perror("getprotobyname"); return -1; } if ((s = socket(PF_INET, SOCK_DGRAM, proto->p_proto)) < 0) { perror("socket"); return -1; } on = 1; memset(&from, 0, sizeof from); from.sin_family = AF_INET; from.sin_port = htons(0); memcpy(&from.sin_addr.s_addr, src, 4); fprintf(stderr, "bind:%d\n", bind(s, (struct sockaddr*)&from, sizeof from)); memset(&to, 0, sizeof to); to.sin_family = AF_INET; to.sin_port = htons(port); memcpy(&to.sin_addr.s_addr, dest, 4); len = 58; cnt = 0; while (1) { memset(data, cnt, len); rc = sendto(s, data, len, 0, (struct sockaddr*)&to, sizeof to); if (rc < 0) perror(""); fprintf(stderr, "%d %d\n", rc, cnt); sleep(5); ++cnt; } close(s); return 0; }