Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!gatech!akgua!mcnc!tas From: tas@mcnc.UUCP (Tim Seaver) Newsgroups: net.unix-wizards,net.bugs.4bsd Subject: 4.3 BSD subnet bug Message-ID: <1627@alvin.mcnc.UUCP> Date: Tue, 9-Sep-86 10:53:33 EDT Article-I.D.: alvin.1627 Posted: Tue Sep 9 10:53:33 1986 Date-Received: Wed, 10-Sep-86 17:43:21 EDT Organization: Microelectronics Center of NC; RTP, NC Lines: 30 Keywords: network,subnets Xref: mnetor net.unix-wizards:7835 net.bugs.4bsd:926 The 4.3 BSD in_localaddr routine in sys/netinet/in.c is completely broken in its handling of subnets. This causes the wrong tcp maximum segment size to be chosen when making connections to non-local subnets of the local network, leading to extra fragmentation. I believe the following replacement handles things correctly: in_localaddr(in) struct in_addr in; { register u_long net = ntohl(in.s_addr); register struct in_ifaddr *ia; if (subnetsarelocal) { for (ia = in_ifaddr; ia; ia = ia->ia_next) if ((net&ia->ia_netmask) == ia->ia_net) return (1); } else { for (ia = in_ifaddr; ia; ia = ia->ia_next) if ((net&ia->ia_subnetmask) == ia->ia_subnet) return (1); } return (0); } Tim Seaver Microelectronics Center of North Carolina mcnc!tas tas@mcnc.org