#include <linux/route.h>
#include <linux/ip.h>
#include <linux/cache.h>
+#include <linux/vs_base.h>
#include <linux/vs_context.h>
#include <linux/vs_network.h>
return ip_tos2prio[IPTOS_TOS(tos)>>1];
}
-#define IPI_LOOPBACK 0x0100007f
-
-static inline int ip_find_src(struct nx_info *nxi, struct rtable **rp, struct flowi *fl)
-{
- int err;
- int i, n = nxi->nbipv4;
- u32 ipv4root = nxi->ipv4[0];
-
- if (ipv4root == 0)
- return 0;
-
- if (fl->fl4_src == 0) {
- if (n > 1) {
- u32 foundsrc;
-
- err = __ip_route_output_key(rp, fl);
- if (err) {
- fl->fl4_src = ipv4root;
- err = __ip_route_output_key(rp, fl);
- }
- if (err)
- return err;
-
- foundsrc = (*rp)->rt_src;
- ip_rt_put(*rp);
-
- for (i=0; i<n; i++){
- u32 mask = nxi->mask[i];
- u32 ipv4 = nxi->ipv4[i];
- u32 net4 = ipv4 & mask;
-
- if (foundsrc == ipv4) {
- fl->fl4_src = ipv4;
- break;
- }
- if (!fl->fl4_src && (foundsrc & mask) == net4)
- fl->fl4_src = ipv4;
- }
- }
- if (fl->fl4_src == 0)
- fl->fl4_src = (fl->fl4_dst == IPI_LOOPBACK)
- ? IPI_LOOPBACK : ipv4root;
- } else {
- for (i=0; i<n; i++) {
- if (nxi->ipv4[i] == fl->fl4_src)
- break;
- }
- if (i == n)
- return -EPERM;
- }
- return 0;
-}
-
static inline int ip_route_connect(struct rtable **rp, u32 dst,
u32 src, u32 tos, int oif, u8 protocol,
u16 sport, u16 dport, struct sock *sk)
.dport = dport } } };
int err;
- struct nx_info *nx_info = current->nx_info;
-
- if (sk)
- nx_info = sk->sk_nx_info;
- vxdprintk(VXD_CBIT(net, 4),
- "ip_route_connect(%p) %p,%p;%lx",
- sk, nx_info, sk->sk_socket,
- (sk->sk_socket?sk->sk_socket->flags:0));
-
- if (nx_info) {
- err = ip_find_src(nx_info, rp, &fl);
- if (err)
- return err;
- if (fl.fl4_dst == IPI_LOOPBACK && !vx_check(0, VX_ADMIN))
- fl.fl4_dst = nx_info->ipv4[0];
- }
- if (!fl.fl4_dst || !fl.fl4_src) {
+ if (!dst || !src) {
err = __ip_route_output_key(rp, &fl);
if (err)
return err;