From 97be95af016ec31d022b85644636974768bbebeb Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Sat, 19 Oct 2002 09:50:10 -0700 Subject: [IPV4]: Provide full proto/ports in flowi route lookups. --- include/net/route.h | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'include/net') diff --git a/include/net/route.h b/include/net/route.h index 621b0c44b250..0a65f6a6b884 100644 --- a/include/net/route.h +++ b/include/net/route.h @@ -139,12 +139,16 @@ static inline char rt_tos2priority(u8 tos) return ip_tos2prio[IPTOS_TOS(tos)>>1]; } -static inline int ip_route_connect(struct rtable **rp, u32 dst, u32 src, u32 tos, int oif) +static inline int ip_route_connect(struct rtable **rp, u32 dst, u32 src, u32 tos, int oif, u8 protocol, u16 sport, u16 dport) { - struct flowi fl = { .nl_u = { .ip4_u = { .daddr = dst, + struct flowi fl = { .oif = oif, + .nl_u = { .ip4_u = { .daddr = dst, .saddr = src, .tos = tos } }, - .oif = oif }; + .proto = protocol, + .uli_u = { .ports = + { .sport = sport, + .dport = dport } } }; int err; err = ip_route_output_key(rp, &fl); @@ -157,6 +161,21 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, u32 src, u32 tos return ip_route_output_key(rp, &fl); } +static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport) +{ + if (sport != (*rp)->fl.uli_u.ports.sport || + dport != (*rp)->fl.uli_u.ports.dport) { + struct flowi fl; + + memcpy(&fl, &(*rp)->fl, sizeof(fl)); + fl.uli_u.ports.sport = sport; + fl.uli_u.ports.dport = dport; + *rp = NULL; + return ip_route_output_key(rp, &fl); + } + return 0; +} + extern void rt_bind_peer(struct rtable *rt, int create); static inline struct inet_peer *rt_get_peer(struct rtable *rt) -- cgit v1.2.3