routing bug?
Mike Tancsa
mike at sentex.net
Fri May 7 11:51:11 PDT 2004
Whoops, spoke too soon. It actually still is fixed on current. I guess
the question is, why the different behavior between how the program works
below on STABLE and HEAD ?
Oddly enough, OpenBSD has the same behavior as RELENG_4 does which seems
somewhat broken no ?
---Mike
At 02:41 PM 07/05/2004, Mike Tancsa wrote:
>A follow up to this. The problem works only with IPSEC in the
>kernel. This bug is also present in HEAD as of yesterday as well (
>FreeBSD 5.2-CURRENT #0: Thu May 6 18:50:14 EDT 2004 )
>
>cc'ing to current.
>
> ---Mike
>
>At 09:59 AM 07/05/2004, Gabor wrote:
>>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<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> 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 <full-duplex>)
>> status: active
>>ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
>>faith0: flags=8002<BROADCAST,MULTICAST> mtu 1500
>>ds0: flags=8008<LOOPBACK,MULTICAST> mtu 65532
>>lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
>> inet 172.16.24.33 netmask 0xffff0000
>> inet 172.0.0.1 netmask 0xffff0000
>>tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500
>>
>>=0= udp-test # cat udp-test.c
>>#include <sys/types.h>
>>#include <sys/time.h>
>>#include <sys/socket.h>
>>#include <netinet/in.h>
>>#include <netdb.h>
>>#include <unistd.h>
>>#include <stdio.h>
>>#include <stdlib.h>
>>#include <string.h>
>>#include <ctype.h>
>>
>>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 <source> <dest>:<port>\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 <source> <dest>:<port>\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;
>>}
>>
>>_______________________________________________
>>freebsd-stable at freebsd.org mailing list
>>http://lists.freebsd.org/mailman/listinfo/freebsd-stable
>>To unsubscribe, send any mail to "freebsd-stable-unsubscribe at freebsd.org"
>
>_______________________________________________
>freebsd-stable at freebsd.org mailing list
>http://lists.freebsd.org/mailman/listinfo/freebsd-stable
>To unsubscribe, send any mail to "freebsd-stable-unsubscribe at freebsd.org"
More information about the freebsd-stable
mailing list