PERFORCE change 40367 for review
Sam Leffler
sam at FreeBSD.org
Thu Oct 23 21:56:57 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=40367
Change 40367 by sam at sam_ebb on 2003/10/23 21:56:06
import andre's latest tcp hostcache patch
Affected files ...
.. //depot/projects/hostcache/sys/conf/files#2 edit
.. //depot/projects/hostcache/sys/net/if_arcsubr.c#2 edit
.. //depot/projects/hostcache/sys/net/if_ef.c#2 edit
.. //depot/projects/hostcache/sys/net/if_ethersubr.c#2 edit
.. //depot/projects/hostcache/sys/net/if_faith.c#2 edit
.. //depot/projects/hostcache/sys/net/if_fddisubr.c#2 edit
.. //depot/projects/hostcache/sys/net/if_iso88025subr.c#2 edit
.. //depot/projects/hostcache/sys/net/if_loop.c#2 edit
.. //depot/projects/hostcache/sys/net/if_ppp.c#2 edit
.. //depot/projects/hostcache/sys/net/route.c#2 edit
.. //depot/projects/hostcache/sys/net/route.h#2 edit
.. //depot/projects/hostcache/sys/net/rtsock.c#2 edit
.. //depot/projects/hostcache/sys/netatalk/ddp_output.c#2 edit
.. //depot/projects/hostcache/sys/netinet/icmp_var.h#2 edit
.. //depot/projects/hostcache/sys/netinet/in_pcb.c#2 edit
.. //depot/projects/hostcache/sys/netinet/in_pcb.h#2 edit
.. //depot/projects/hostcache/sys/netinet/in_rmx.c#2 edit
.. //depot/projects/hostcache/sys/netinet/in_var.h#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_divert.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_fastforward.c#3 add
.. //depot/projects/hostcache/sys/netinet/ip_flow.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_flow.h#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_fw.h#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_fw2.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_icmp.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_input.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_output.c#2 edit
.. //depot/projects/hostcache/sys/netinet/ip_var.h#2 edit
.. //depot/projects/hostcache/sys/netinet/raw_ip.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp.h#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_hostcache.c#3 add
.. //depot/projects/hostcache/sys/netinet/tcp_input.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_output.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_subr.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_syncache.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_timer.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_usrreq.c#2 edit
.. //depot/projects/hostcache/sys/netinet/tcp_var.h#2 edit
.. //depot/projects/hostcache/sys/netinet/udp_usrreq.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/icmp6.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/in6_pcb.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/in6_rmx.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/in6_src.c#3 edit
.. //depot/projects/hostcache/sys/netinet6/ip6_forward.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/ip6_input.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/ip6_output.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/raw_ip6.c#2 edit
.. //depot/projects/hostcache/sys/netinet6/udp6_output.c#2 edit
.. //depot/projects/hostcache/sys/netipx/ipx_input.c#2 edit
.. //depot/projects/hostcache/sys/netipx/ipx_outputfl.c#2 edit
.. //depot/projects/hostcache/sys/sys/mbuf.h#2 edit
Differences ...
==== //depot/projects/hostcache/sys/conf/files#2 (text+ko) ====
@@ -1424,7 +1424,7 @@
netinet/ip_ecn.c optional inet6
netinet/ip_encap.c optional inet
netinet/ip_encap.c optional inet6
-netinet/ip_flow.c optional inet
+netinet/ip_fastforward.c optional inet
netinet/ip_fw2.c optional ipfirewall
netinet/ip_icmp.c optional inet
netinet/ip_input.c optional inet
@@ -1432,6 +1432,7 @@
netinet/ip_output.c optional inet
netinet/raw_ip.c optional inet
netinet/tcp_debug.c optional tcpdebug
+netinet/tcp_hostcache.c optional inet
netinet/tcp_input.c optional inet
netinet/tcp_output.c optional inet
netinet/tcp_subr.c optional inet
==== //depot/projects/hostcache/sys/net/if_arcsubr.c#2 (text+ko) ====
@@ -543,14 +543,14 @@
#ifdef INET
case ARCTYPE_IP:
m_adj(m, ARC_HDRNEWLEN);
- if (ipflow_fastforward(m))
+ if (ip_fastforward(m))
return;
isr = NETISR_IP;
break;
case ARCTYPE_IP_OLD:
m_adj(m, ARC_HDRLEN);
- if (ipflow_fastforward(m))
+ if (ip_fastforward(m))
return;
isr = NETISR_IP;
break;
==== //depot/projects/hostcache/sys/net/if_ef.c#2 (text+ko) ====
@@ -252,8 +252,8 @@
#endif
#ifdef INET
case ETHERTYPE_IP:
- if (ipflow_fastforward(m))
- return (0);
+ if (ip_fastforward(m))
+ return;
isr = NETISR_IP;
break;
==== //depot/projects/hostcache/sys/net/if_ethersubr.c#2 (text+ko) ====
@@ -717,7 +717,7 @@
switch (ether_type) {
#ifdef INET
case ETHERTYPE_IP:
- if (ipflow_fastforward(m))
+ if (ip_fastforward(m))
return;
isr = NETISR_IP;
break;
==== //depot/projects/hostcache/sys/net/if_faith.c#2 (text+ko) ====
@@ -271,17 +271,8 @@
struct rt_addrinfo *info;
{
RT_LOCK_ASSERT(rt);
-
- if (rt) {
- rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu; /* for ISO */
- /*
- * For optimal performance, the send and receive buffers
- * should be at least twice the MTU plus a little more for
- * overhead.
- */
- rt->rt_rmx.rmx_recvpipe =
- rt->rt_rmx.rmx_sendpipe = 3 * FAITHMTU;
- }
+ if (rt)
+ rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu;
}
/*
==== //depot/projects/hostcache/sys/net/if_fddisubr.c#2 (text+ko) ====
@@ -471,7 +471,7 @@
switch (type) {
#ifdef INET
case ETHERTYPE_IP:
- if (ipflow_fastforward(m))
+ if (ip_fastforward(m))
return;
isr = NETISR_IP;
break;
==== //depot/projects/hostcache/sys/net/if_iso88025subr.c#2 (text+ko) ====
@@ -556,7 +556,7 @@
#ifdef INET
case ETHERTYPE_IP:
th->iso88025_shost[0] &= ~(TR_RII);
- if (ipflow_fastforward(m))
+ if (ip_fastforward(m))
return;
isr = NETISR_IP;
break;
==== //depot/projects/hostcache/sys/net/if_loop.c#2 (text+ko) ====
@@ -357,17 +357,8 @@
struct rt_addrinfo *info;
{
RT_LOCK_ASSERT(rt);
-
- if (rt) {
- rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu; /* for ISO */
- /*
- * For optimal performance, the send and receive buffers
- * should be at least twice the MTU plus a little more for
- * overhead.
- */
- rt->rt_rmx.rmx_recvpipe =
- rt->rt_rmx.rmx_sendpipe = 3 * LOMTU;
- }
+ if (rt)
+ rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu;
}
/*
==== //depot/projects/hostcache/sys/net/if_ppp.c#2 (text+ko) ====
@@ -1538,8 +1538,8 @@
m->m_pkthdr.len -= PPP_HDRLEN;
m->m_data += PPP_HDRLEN;
m->m_len -= PPP_HDRLEN;
- if (ipflow_fastforward(m))
- return;
+ if (ip_fastforward(m))
+ return;
isr = NETISR_IP;
break;
#endif
==== //depot/projects/hostcache/sys/net/route.c#2 (text+ko) ====
@@ -139,7 +139,7 @@
*/
newrt = rt = (struct rtentry *)rn;
nflags = rt->rt_flags & ~ignflags;
- if (report && (nflags & (RTF_CLONING | RTF_PRCLONING))) {
+ if (report && (nflags & RTF_CLONING)) {
/*
* We are apparently adding (report = 0 in delete).
* If it requires that it be cloned, do so.
@@ -548,7 +548,7 @@
*/
if (flags & RTF_HOST) {
netmask = 0;
- flags &= ~(RTF_CLONING | RTF_PRCLONING);
+ flags &= ~RTF_CLONING;
}
switch (req) {
case RTM_DELETE:
@@ -570,7 +570,7 @@
* Now search what's left of the subtree for any cloned
* routes which might have been formed from this node.
*/
- if ((rt->rt_flags & (RTF_CLONING | RTF_PRCLONING)) &&
+ if ((rt->rt_flags & RTF_CLONING) &&
rt_mask(rt)) {
rnh->rnh_walktree_from(rnh, dst, rt_mask(rt),
rt_fixdelete, rt);
@@ -617,7 +617,7 @@
ifa = rt->rt_ifa;
/* XXX locking? */
flags = rt->rt_flags &
- ~(RTF_CLONING | RTF_PRCLONING | RTF_STATIC);
+ ~(RTF_CLONING | RTF_STATIC);
flags |= RTF_WASCLONED;
gateway = rt->rt_gateway;
if ((netmask = rt->rt_genmask) == 0)
@@ -678,11 +678,11 @@
/*
* Uh-oh, we already have one of these in the tree.
* We do a special hack: if the route that's already
- * there was generated by the protocol-cloning
- * mechanism, then we just blow it away and retry
- * the insertion of the new one.
+ * there was generated by the cloning mechanism
+ * then we just blow it away and retry the insertion
+ * of the new one.
*/
- rt2 = rtalloc1(dst, 0, RTF_PRCLONING);
+ rt2 = rtalloc1(dst, 0, 0);
if (rt2 && rt2->rt_parent) {
rtrequest(RTM_DELETE,
rt_key(rt2),
@@ -724,7 +724,7 @@
("no route to clone from"));
rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
rt->rt_rmx.rmx_pksent = 0; /* reset packet counter */
- if ((*ret_nrt)->rt_flags & (RTF_CLONING | RTF_PRCLONING)) {
+ if ((*ret_nrt)->rt_flags & RTF_CLONING) {
/*
* NB: We do not bump the refcnt on the parent
* entry under the assumption that it will
@@ -800,7 +800,7 @@
struct rtentry *rt0 = vp;
if (rt->rt_parent == rt0 &&
- !(rt->rt_flags & (RTF_PINNED | RTF_CLONING | RTF_PRCLONING))) {
+ !(rt->rt_flags & (RTF_PINNED | RTF_CLONING))) {
return rtrequest(RTM_DELETE, rt_key(rt),
(struct sockaddr *)0, rt_mask(rt),
rt->rt_flags, (struct rtentry **)0);
@@ -841,7 +841,7 @@
#endif
if (!rt->rt_parent ||
- (rt->rt_flags & (RTF_PINNED | RTF_CLONING | RTF_PRCLONING))) {
+ (rt->rt_flags & (RTF_PINNED | RTF_CLONING))) {
#ifdef DEBUG
if(rtfcdebug) printf("no parent, pinned or cloning\n");
#endif
@@ -992,9 +992,10 @@
* correct choice anyway), and avoid the resulting reference loops
* by disallowing any route to run through itself as a gateway.
* This is obviously mandatory when we get rt->rt_output().
+ * XXX: After removal of PRCLONING this probably not needed anymore.
*/
if (rt->rt_flags & RTF_GATEWAY) {
- rt->rt_gwroute = rtalloc1(gate, 1, RTF_PRCLONING);
+ rt->rt_gwroute = rtalloc1(gate, 1, 0);
if (rt->rt_gwroute == rt) {
RTFREE_LOCKED(rt->rt_gwroute);
rt->rt_gwroute = 0;
==== //depot/projects/hostcache/sys/net/route.h#2 (text+ko) ====
@@ -58,6 +58,12 @@
* These numbers are used by reliable protocols for determining
* retransmission behavior and are included in the routing structure.
*/
+struct rt_metrics_lite {
+ u_long rmx_mtu; /* MTU for this path */
+ u_long rmx_expire; /* lifetime for route, e.g. redirect */
+ u_long rmx_pksent; /* packets sent using this route */
+};
+
struct rt_metrics {
u_long rmx_locks; /* Kernel must leave these values alone */
u_long rmx_mtu; /* MTU for this path */
@@ -104,10 +110,10 @@
long rt_refcnt; /* # held references */
u_long rt_flags; /* up/down?, host/net */
struct ifnet *rt_ifp; /* the answer: interface to use */
- struct ifaddr *rt_ifa; /* the answer: interface to use */
+ struct ifaddr *rt_ifa; /* the answer: interface address to use */
struct sockaddr *rt_genmask; /* for generation of cloned routes */
caddr_t rt_llinfo; /* pointer to link level info cache */
- struct rt_metrics rt_rmx; /* metrics used by rx'ing protocols */
+ struct rt_metrics_lite rt_rmx; /* metrics used by rx'ing protocols */
struct rtentry *rt_gwroute; /* implied entry for gatewayed routes */
int (*rt_output)(struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *);
@@ -151,7 +157,7 @@
#define RTF_PROTO2 0x4000 /* protocol specific routing flag */
#define RTF_PROTO1 0x8000 /* protocol specific routing flag */
-#define RTF_PRCLONING 0x10000 /* protocol requires cloning */
+/* 0x10000 unused */
#define RTF_WASCLONED 0x20000 /* route generated through cloning */
#define RTF_PROTO3 0x40000 /* protocol specific routing flag */
/* 0x80000 unused */
==== //depot/projects/hostcache/sys/net/rtsock.c#2 (text+ko) ====
@@ -86,7 +86,8 @@
static int sysctl_dumpentry(struct radix_node *rn, void *vw);
static int sysctl_iflist(int af, struct walkarg *w);
static int route_output(struct mbuf *, struct socket *);
-static void rt_setmetrics(u_long, struct rt_metrics *, struct rt_metrics *);
+static void rt_setmetrics(u_long, struct rt_metrics *, struct rt_metrics_lite *);
+static void rt_getmetrics(struct rt_metrics_lite *, struct rt_metrics *);
static void rt_dispatch(struct mbuf *, struct sockaddr *);
/*
@@ -354,9 +355,6 @@
RT_LOCK(saved_nrt);
rt_setmetrics(rtm->rtm_inits,
&rtm->rtm_rmx, &saved_nrt->rt_rmx);
- saved_nrt->rt_rmx.rmx_locks &= ~(rtm->rtm_inits);
- saved_nrt->rt_rmx.rmx_locks |=
- (rtm->rtm_inits & rtm->rtm_rmx.rmx_locks);
saved_nrt->rt_refcnt--;
saved_nrt->rt_genmask = info.rti_info[RTAX_GENMASK];
RT_UNLOCK(saved_nrt);
@@ -427,7 +425,7 @@
(void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm,
(struct walkarg *)0);
rtm->rtm_flags = rt->rt_flags;
- rtm->rtm_rmx = rt->rt_rmx;
+ rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
rtm->rtm_addrs = info.rti_addrs;
break;
@@ -477,9 +475,7 @@
rt->rt_genmask = info.rti_info[RTAX_GENMASK];
/* FALLTHROUGH */
case RTM_LOCK:
- rt->rt_rmx.rmx_locks &= ~(rtm->rtm_inits);
- rt->rt_rmx.rmx_locks |=
- (rtm->rtm_inits & rtm->rtm_rmx.rmx_locks);
+ /* We don't support locks anymore */
break;
}
RT_UNLOCK(rt);
@@ -541,20 +537,28 @@
}
static void
-rt_setmetrics(u_long which, struct rt_metrics *in, struct rt_metrics *out)
+rt_setmetrics(u_long which, struct rt_metrics *in, struct rt_metrics_lite *out)
{
#define metric(f, e) if (which & (f)) out->e = in->e;
- metric(RTV_RPIPE, rmx_recvpipe);
- metric(RTV_SPIPE, rmx_sendpipe);
- metric(RTV_SSTHRESH, rmx_ssthresh);
- metric(RTV_RTT, rmx_rtt);
- metric(RTV_RTTVAR, rmx_rttvar);
- metric(RTV_HOPCOUNT, rmx_hopcount);
+ /*
+ * Only these are stored in the routing entry since introduction
+ * of tcp hostcache. The rest is ignored.
+ */
metric(RTV_MTU, rmx_mtu);
metric(RTV_EXPIRE, rmx_expire);
#undef metric
}
+static void
+rt_getmetrics(struct rt_metrics_lite *in, struct rt_metrics *out)
+{
+#define metric(e) out->e = in->e;
+ bzero(out, sizeof(*out));
+ metric(rmx_mtu);
+ metric(rmx_expire);
+#undef metric
+}
+
#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
@@ -944,8 +948,8 @@
struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem;
rtm->rtm_flags = rt->rt_flags;
- rtm->rtm_use = rt->rt_use;
- rtm->rtm_rmx = rt->rt_rmx;
+ rtm->rtm_use = rt->rt_rmx.rmx_pksent;
+ rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx);
rtm->rtm_index = rt->rt_ifp->if_index;
rtm->rtm_errno = rtm->rtm_pid = rtm->rtm_seq = 0;
rtm->rtm_addrs = info.rti_addrs;
==== //depot/projects/hostcache/sys/netatalk/ddp_output.c#2 (text+ko) ====
@@ -217,7 +217,7 @@
elh->el_type = ELAP_DDPEXTEND;
elh->el_dnode = gate.sat_addr.s_node;
}
- ro->ro_rt->rt_use++;
+ ro->ro_rt->rt_rmx.rmx_pksent++;
#ifdef NETATALK_DEBUG
printf ("ddp_route: from %d.%d to %d.%d, via %d.%d (%s%d)\n",
==== //depot/projects/hostcache/sys/netinet/icmp_var.h#2 (text+ko) ====
@@ -81,11 +81,12 @@
extern int badport_bandlim(int);
#define BANDLIM_UNLIMITED -1
#define BANDLIM_ICMP_UNREACH 0
-#define BANDLIM_ICMP_ECHO 1
-#define BANDLIM_ICMP_TSTAMP 2
-#define BANDLIM_RST_CLOSEDPORT 3 /* No connection, and no listeners */
-#define BANDLIM_RST_OPENPORT 4 /* No connection, listener */
-#define BANDLIM_MAX 4
+#define BANDLIM_ICMP_UNREACH_HOST 1
+#define BANDLIM_ICMP_ECHO 2
+#define BANDLIM_ICMP_TSTAMP 3
+#define BANDLIM_RST_CLOSEDPORT 4 /* No connection, and no listeners */
+#define BANDLIM_RST_OPENPORT 5 /* No connection, listener */
+#define BANDLIM_MAX 5
#endif
#endif
==== //depot/projects/hostcache/sys/netinet/in_pcb.c#2 (text+ko) ====
@@ -536,7 +536,6 @@
if (error)
return (error);
}
-
if (!TAILQ_EMPTY(&in_ifaddrhead)) {
/*
* If the destination address is INADDR_ANY,
@@ -554,7 +553,8 @@
&in_ifaddrhead)->ia_broadaddr)->sin_addr;
}
if (laddr.s_addr == INADDR_ANY) {
- register struct route *ro;
+ struct route *ro;
+ struct route sro;
ia = (struct in_ifaddr *)0;
/*
@@ -563,19 +563,10 @@
* Note that we should check the address family of the cached
* destination, in case of sharing the cache with IPv6.
*/
- ro = &inp->inp_route;
- if (ro->ro_rt &&
- (ro->ro_dst.sa_family != AF_INET ||
- satosin(&ro->ro_dst)->sin_addr.s_addr != faddr.s_addr ||
- inp->inp_socket->so_options & SO_DONTROUTE)) {
- RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)0;
- }
- if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0 && /*XXX*/
- (ro->ro_rt == (struct rtentry *)0 ||
- ro->ro_rt->rt_ifp == (struct ifnet *)0)) {
- /* No route yet, so try to acquire one */
- bzero(&ro->ro_dst, sizeof(struct sockaddr_in));
+ ro = &sro;
+ bzero(ro, sizeof(*ro));
+ if ((inp->inp_socket->so_options & SO_DONTROUTE) == 0) {
+ /* Find out route to destination */
ro->ro_dst.sa_family = AF_INET;
ro->ro_dst.sa_len = sizeof(struct sockaddr_in);
((struct sockaddr_in *)&ro->ro_dst)->sin_addr = faddr;
@@ -589,6 +580,8 @@
*/
if (ro->ro_rt && !(ro->ro_rt->rt_ifp->if_flags & IFF_LOOPBACK))
ia = ifatoia(ro->ro_rt->rt_ifa);
+ if (ro->ro_rt)
+ RTFREE(ro->ro_rt);
if (ia == 0) {
bzero(&sa, sizeof(sa));
sa.sin_addr = faddr;
@@ -675,8 +668,6 @@
}
if (inp->inp_options)
(void)m_free(inp->inp_options);
- if (inp->inp_route.ro_rt)
- RTFREE(inp->inp_route.ro_rt);
ip_freemoptions(inp->inp_moptions);
inp->inp_vflag = 0;
INP_LOCK_DESTROY(inp);
@@ -850,60 +841,6 @@
}
/*
- * Check for alternatives when higher level complains
- * about service problems. For now, invalidate cached
- * routing information. If the route was created dynamically
- * (by a redirect), time to try a default gateway again.
- */
-void
-in_losing(inp)
- struct inpcb *inp;
-{
- register struct rtentry *rt;
- struct rt_addrinfo info;
-
- if ((rt = inp->inp_route.ro_rt)) {
- RT_LOCK(rt);
- inp->inp_route.ro_rt = NULL;
- bzero((caddr_t)&info, sizeof(info));
- info.rti_flags = rt->rt_flags;
- info.rti_info[RTAX_DST] = rt_key(rt);
- info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
- info.rti_info[RTAX_NETMASK] = rt_mask(rt);
- rt_missmsg(RTM_LOSING, &info, rt->rt_flags, 0);
- if (rt->rt_flags & RTF_DYNAMIC) {
- RT_UNLOCK(rt); /* XXX refcnt? */
- (void) rtrequest1(RTM_DELETE, &info, NULL);
- } else
- rtfree(rt);
- /*
- * A new route can be allocated
- * the next time output is attempted.
- */
- }
-}
-
-/*
- * After a routing change, flush old routing
- * and allocate a (hopefully) better one.
- */
-struct inpcb *
-in_rtchange(inp, errno)
- register struct inpcb *inp;
- int errno;
-{
- if (inp->inp_route.ro_rt) {
- RTFREE(inp->inp_route.ro_rt);
- inp->inp_route.ro_rt = 0;
- /*
- * A new route can be allocated the next time
- * output is attempted.
- */
- }
- return inp;
-}
-
-/*
* Lookup a PCB based on the local address and port.
*/
struct inpcb *
==== //depot/projects/hostcache/sys/netinet/in_pcb.h#2 (text+ko) ====
@@ -94,31 +94,22 @@
/*
* XXX
- * At some point struct route should possibly change to:
- * struct rtentry *rt
- * struct in_endpoints *ie;
+ * the defines for inc_* are hacks and should be changed to direct references
*/
struct in_conninfo {
u_int8_t inc_flags;
u_int8_t inc_len;
u_int16_t inc_pad; /* XXX alignment for in_endpoints */
- /* protocol dependent part; cached route */
+ /* protocol dependent part */
struct in_endpoints inc_ie;
- union {
- /* placeholder for routing entry */
- struct route inc4_route;
- struct route_in6 inc6_route;
- } inc_dependroute;
};
#define inc_isipv6 inc_flags /* temp compatability */
#define inc_fport inc_ie.ie_fport
#define inc_lport inc_ie.ie_lport
#define inc_faddr inc_ie.ie_faddr
#define inc_laddr inc_ie.ie_laddr
-#define inc_route inc_dependroute.inc4_route
#define inc6_faddr inc_ie.ie6_faddr
#define inc6_laddr inc_ie.ie6_laddr
-#define inc6_route inc_dependroute.inc6_route
struct icmp6_filter;
@@ -156,7 +147,6 @@
#define inp_lport inp_inc.inc_lport
#define inp_faddr inp_inc.inc_faddr
#define inp_laddr inp_inc.inc_laddr
-#define inp_route inp_inc.inc_route
#define inp_ip_tos inp_depend4.inp4_ip_tos
#define inp_options inp_depend4.inp4_options
#define inp_moptions inp_depend4.inp4_moptions
@@ -182,7 +172,6 @@
#define in6p_faddr inp_inc.inc6_faddr
#define in6p_laddr inp_inc.inc6_laddr
-#define in6p_route inp_inc.inc6_route
#define in6p_ip6_hlim inp_depend6.inp6_hlim
#define in6p_hops inp_depend6.inp6_hops /* default hop limit */
#define in6p_ip6_nxt inp_ip_p
@@ -327,9 +316,6 @@
extern int ipport_hilastauto;
void in_pcbpurgeif0(struct inpcbinfo *, struct ifnet *);
-void in_losing(struct inpcb *);
-struct inpcb *
- in_rtchange(struct inpcb *, int);
int in_pcballoc(struct socket *, struct inpcbinfo *, struct thread *);
int in_pcbbind(struct inpcb *, struct sockaddr *, struct thread *);
int in_pcbbind_setup(struct inpcb *, struct sockaddr *, in_addr_t *,
==== //depot/projects/hostcache/sys/netinet/in_rmx.c#2 (text+ko) ====
@@ -73,15 +73,6 @@
struct radix_node *ret;
/*
- * For IP, all unicast non-host routes are automatically cloning.
- */
- if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
- rt->rt_flags |= RTF_MULTICAST;
-
- if (!(rt->rt_flags & (RTF_HOST | RTF_CLONING | RTF_MULTICAST)))
- rt->rt_flags |= RTF_PRCLONING;
-
- /*
* A little bit of help for both IP output and input:
* For host routes, we make sure that RTF_BROADCAST
* is set for anything that looks like a broadcast address.
@@ -94,8 +85,7 @@
*
* We also mark routes to multicast addresses as such, because
* it's easy to do and might be useful (but this is much more
- * dubious since it's so easy to inspect the address). (This
- * is done above.)
+ * dubious since it's so easy to inspect the address).
*/
if (rt->rt_flags & RTF_HOST) {
if (in_broadcast(sin->sin_addr, rt->rt_ifp)) {
@@ -105,9 +95,10 @@
rt->rt_flags |= RTF_LOCAL;
}
}
+ if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
+ rt->rt_flags |= RTF_MULTICAST;
- if (!rt->rt_rmx.rmx_mtu && !(rt->rt_rmx.rmx_locks & RTV_MTU) &&
- rt->rt_ifp)
+ if (!rt->rt_rmx.rmx_mtu && rt->rt_ifp)
rt->rt_rmx.rmx_mtu = rt->rt_ifp->if_mtu;
ret = rn_addroute(v_arg, n_arg, head, treenodes);
@@ -118,8 +109,7 @@
* Find out if it is because of an
* ARP entry and delete it if so.
*/
- rt2 = rtalloc1((struct sockaddr *)sin, 0,
- RTF_CLONING | RTF_PRCLONING);
+ rt2 = rtalloc1((struct sockaddr *)sin, 0, RTF_CLONING);
if (rt2) {
if (rt2->rt_flags & RTF_LLINFO &&
rt2->rt_flags & RTF_HOST &&
@@ -138,14 +128,6 @@
RTFREE_LOCKED(rt2);
}
}
-
- /*
- * If the new route created successfully, and we are forwarding,
- * flush any cached routes to avoid using a stale value.
- */
- if (ret != NULL && ipforwarding)
- ip_forward_cacheinval();
-
return ret;
}
@@ -398,7 +380,7 @@
* so that behavior is not needed there.
*/
RT_LOCK(rt);
- rt->rt_flags &= ~(RTF_CLONING | RTF_PRCLONING);
+ rt->rt_flags &= ~RTF_CLONING;
RT_UNLOCK(rt);
err = rtrequest(RTM_DELETE, (struct sockaddr *)rt_key(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, 0);
==== //depot/projects/hostcache/sys/netinet/in_var.h#2 (text+ko) ====
@@ -230,9 +230,7 @@
void ip_input(struct mbuf *);
int in_ifadown(struct ifaddr *ifa, int);
void in_ifscrub(struct ifnet *, struct in_ifaddr *);
-int ipflow_fastforward(struct mbuf *);
-void ipflow_create(const struct route *, struct mbuf *);
-void ipflow_slowtimo(void);
+int ip_fastforward(struct mbuf *);
#endif /* _KERNEL */
==== //depot/projects/hostcache/sys/netinet/ip_divert.c#2 (text+ko) ====
@@ -333,7 +333,7 @@
/* Send packet to output processing */
ipstat.ips_rawout++; /* XXX */
error = ip_output((struct mbuf *)&divert_tag,
- inp->inp_options, &inp->inp_route,
+ inp->inp_options, NULL,
(so->so_options & SO_DONTROUTE) |
IP_ALLOWBROADCAST | IP_RAWOUTPUT,
inp->inp_moptions, NULL);
==== //depot/projects/hostcache/sys/netinet/ip_flow.c#2 (text+ko) ====
@@ -1,377 +1,1 @@
-/*-
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
- * All rights reserved.
- *
- * This code is derived from software contributed to The NetBSD Foundation
- * by the 3am Software Foundry ("3am"). It was developed by Matt Thomas.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the NetBSD
- * Foundation, Inc. and its contributors.
- * 4. Neither the name of The NetBSD Foundation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
- * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * $FreeBSD: src/sys/netinet/ip_flow.c,v 1.15 2003/10/04 03:44:49 sam Exp $
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/lock.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/mutex.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/kernel.h>
-
-#include <sys/sysctl.h>
-
-#include <net/if.h>
-#include <net/route.h>
-
-#include <netinet/in.h>
-#include <netinet/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/in_var.h>
-#include <netinet/ip_var.h>
-#include <netinet/ip_flow.h>
-
-#define IPFLOW_TIMER (5 * PR_SLOWHZ)
-#define IPFLOW_HASHBITS 6 /* should not be a multiple of 8 */
-#define IPFLOW_HASHSIZE (1 << IPFLOW_HASHBITS)
-#if IPFLOW_HASHSIZE > 255
-#error "make ipf_hash larger"
-#endif
-static struct ipflow_head ipflows[IPFLOW_HASHSIZE];
-static int ipflow_inuse;
-#define IPFLOW_MAX 256
-
-/*
- * Each flow list has a lock that guards updates to the list and to
- * all entries on the list. Flow entries hold the hash index for
- * finding the head of the list so the lock can be found quickly.
- *
- * ipflow_inuse holds a count of the number of flow entries present.
- * This is used to bound the size of the table. When IPFLOW_MAX entries
- * are present and an additional entry is needed one is chosen for
- * replacement. We could use atomic ops for this counter but having it
- * inconsistent doesn't appear to be a problem.
- */
-#define IPFLOW_HEAD_LOCK(_ipfh) mtx_lock(&(_ipfh)->ipfh_mtx)
-#define IPFLOW_HEAD_UNLOCK(_ipfh) mtx_unlock(&(_ipfh)->ipfh_mtx)
-#define IPFLOW_LOCK(_ipf) \
- IPFLOW_HEAD_LOCK(&ipflows[(_ipf)->ipf_hash])
-#define IPFLOW_UNLOCK(_ipf) \
- IPFLOW_HEAD_UNLOCK(&ipflows[(_ipf)->ipf_hash])
-
-static int ipflow_active = 0;
-SYSCTL_INT(_net_inet_ip, IPCTL_FASTFORWARDING, fastforwarding, CTLFLAG_RW,
- &ipflow_active, 0, "Enable flow-based IP forwarding");
-
-static MALLOC_DEFINE(M_IPFLOW, "ip_flow", "IP flow");
-
-static unsigned
-ipflow_hash(struct in_addr dst, struct in_addr src, unsigned tos)
-{
- unsigned hash = tos;
- int idx;
- for (idx = 0; idx < 32; idx += IPFLOW_HASHBITS)
- hash += (dst.s_addr >> (32 - idx)) + (src.s_addr >> idx);
- return hash & (IPFLOW_HASHSIZE-1);
-}
-
-static struct ipflow *
-ipflow_lookup(const struct ip *ip)
-{
- unsigned hash;
- struct ipflow_head *head;
- struct ipflow *ipf;
-
- hash = ipflow_hash(ip->ip_dst, ip->ip_src, ip->ip_tos);
- head = &ipflows[hash];
-
- IPFLOW_HEAD_LOCK(head);
- LIST_FOREACH(ipf, &head->ipfh_head, ipf_next) {
- if (ip->ip_dst.s_addr == ipf->ipf_dst.s_addr
- && ip->ip_src.s_addr == ipf->ipf_src.s_addr
- && ip->ip_tos == ipf->ipf_tos) {
- /* NB: return head locked */
- return ipf;
- }
- }
- IPFLOW_HEAD_UNLOCK(head);
- return NULL;
-}
-
-int
-ipflow_fastforward(struct mbuf *m)
-{
- struct ip *ip;
- struct ipflow *ipf;
- struct rtentry *rt;
- struct sockaddr *dst;
- int error;
-
- /*
- * Are we forwarding packets? Big enough for an IP packet?
- */
- if (!ipforwarding || !ipflow_active || m->m_len < sizeof(struct ip))
- return 0;
- /*
- * IP header with no option and valid version and length
- */
- ip = mtod(m, struct ip *);
- if (ip->ip_v != IPVERSION || ip->ip_hl != (sizeof(struct ip) >> 2)
- || ntohs(ip->ip_len) > m->m_pkthdr.len)
- return 0;
- /*
- * Find a flow.
- */
- if ((ipf = ipflow_lookup(ip)) == NULL)
- return 0;
-
- /*
- * Route and interface still up?
- */
- rt = ipf->ipf_ro.ro_rt;
- if ((rt->rt_flags & RTF_UP) == 0 || (rt->rt_ifp->if_flags & IFF_UP) == 0) {
- IPFLOW_UNLOCK(ipf);
- return 0;
- }
-
- /*
- * Packet size OK? TTL?
- */
- if (m->m_pkthdr.len > rt->rt_ifp->if_mtu || ip->ip_ttl <= IPTTLDEC) {
- IPFLOW_UNLOCK(ipf);
- return 0;
- }
-
- /*
- * Everything checks out and so we can forward this packet.
- * Modify the TTL and incrementally change the checksum.
- */
- ip->ip_ttl -= IPTTLDEC;
- if (ip->ip_sum >= htons(0xffff - (IPTTLDEC << 8))) {
- ip->ip_sum += htons(IPTTLDEC << 8) + 1;
- } else {
- ip->ip_sum += htons(IPTTLDEC << 8);
- }
-
- /*
- * Send the packet on its way. All we can get back is ENOBUFS
- */
- ipf->ipf_uses++;
- ipf->ipf_timer = IPFLOW_TIMER;
-
- if (rt->rt_flags & RTF_GATEWAY)
- dst = rt->rt_gateway;
- else
- dst = &ipf->ipf_ro.ro_dst;
- if ((error = (*rt->rt_ifp->if_output)(rt->rt_ifp, m, dst, rt)) != 0) {
- if (error == ENOBUFS)
- ipf->ipf_dropped++;
- else
- ipf->ipf_errors++;
- }
- IPFLOW_UNLOCK(ipf);
- return 1;
-}
-
-static void
-ipflow_addstats(struct ipflow *ipf)
-{
- ipf->ipf_ro.ro_rt->rt_use += ipf->ipf_uses;
- ipstat.ips_cantforward += ipf->ipf_errors + ipf->ipf_dropped;
- ipstat.ips_forward += ipf->ipf_uses;
- ipstat.ips_fastforward += ipf->ipf_uses;
-}
-
-/*
- * XXX the locking here makes reaping an entry very expensive...
- */
-static struct ipflow *
-ipflow_reap(void)
-{
- struct ipflow *victim = NULL;
- struct ipflow *ipf;
- int idx;
-
- for (idx = 0; idx < IPFLOW_HASHSIZE; idx++) {
- struct ipflow_head *head = &ipflows[idx];
-
- IPFLOW_HEAD_LOCK(head);
- LIST_FOREACH(ipf, &head->ipfh_head, ipf_next) {
- /*
- * If this no longer points to a valid route
- * reclaim it.
- */
- if ((ipf->ipf_ro.ro_rt->rt_flags & RTF_UP) == 0)
- goto done;
- /*
- * choose the one that's been least recently used
- * or has had the least uses in the last 1.5
- * intervals.
- */
- if (victim == NULL)
- victim = ipf;
- else if (ipf->ipf_timer < victim->ipf_timer
- || (ipf->ipf_timer == victim->ipf_timer
- && ipf->ipf_last_uses + ipf->ipf_uses <
- victim->ipf_last_uses + victim->ipf_uses)) {
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list