|
|
|
@ -4952,6 +4952,14 @@ static int send_proxy_packet4(struct sk_buff *skb, struct re_address *src, struc |
|
|
|
struct net *net; |
|
|
|
struct rtable *rt; |
|
|
|
|
|
|
|
net = NULL; |
|
|
|
if (par) |
|
|
|
net = PAR_STATE_NET(par); |
|
|
|
if (!net && current && current->nsproxy) |
|
|
|
net = current->nsproxy->net_ns; |
|
|
|
if (!net) |
|
|
|
goto drop; |
|
|
|
|
|
|
|
datalen = skb->len; |
|
|
|
|
|
|
|
uh = (void *) skb_push(skb, sizeof(*uh)); |
|
|
|
@ -4972,7 +4980,7 @@ static int send_proxy_packet4(struct sk_buff *skb, struct re_address *src, struc |
|
|
|
.ihl = 5, |
|
|
|
.tos = tos, |
|
|
|
.tot_len = htons(sizeof(*ih) + datalen), |
|
|
|
.ttl = 64, |
|
|
|
.ttl = net->ipv4.sysctl_ip_default_ttl, |
|
|
|
.protocol = IPPROTO_UDP, |
|
|
|
.saddr = src->u.ipv4, |
|
|
|
.daddr = dst->u.ipv4, |
|
|
|
@ -4980,17 +4988,6 @@ static int send_proxy_packet4(struct sk_buff *skb, struct re_address *src, struc |
|
|
|
|
|
|
|
skb->protocol = htons(ETH_P_IP); |
|
|
|
|
|
|
|
net = NULL; |
|
|
|
if (par) |
|
|
|
net = PAR_STATE_NET(par); |
|
|
|
if (!net && current && current->nsproxy) |
|
|
|
net = current->nsproxy->net_ns; |
|
|
|
if (!net) |
|
|
|
goto drop; |
|
|
|
|
|
|
|
// honour the IPv4 TTL set via sysctl |
|
|
|
ih->ttl = net->ipv4.sysctl_ip_default_ttl; |
|
|
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,10,0) |
|
|
|
rt = ip_route_output(net, dst->u.ipv4, src->u.ipv4, tos, 0, 0); |
|
|
|
#else |
|
|
|
@ -5045,6 +5042,14 @@ static int send_proxy_packet6(struct sk_buff *skb, struct re_address *src, struc |
|
|
|
struct dst_entry *dst_entry; |
|
|
|
struct flowi6 fl6; |
|
|
|
|
|
|
|
net = NULL; |
|
|
|
if (par) |
|
|
|
net = PAR_STATE_NET(par); |
|
|
|
if (!net && current && current->nsproxy) |
|
|
|
net = current->nsproxy->net_ns; |
|
|
|
if (!net) |
|
|
|
goto drop; |
|
|
|
|
|
|
|
datalen = skb->len; |
|
|
|
|
|
|
|
uh = (void *) skb_push(skb, sizeof(*uh)); |
|
|
|
@ -5066,24 +5071,13 @@ static int send_proxy_packet6(struct sk_buff *skb, struct re_address *src, struc |
|
|
|
.flow_lbl = {(tos & 0xf) << 4, 0, 0}, |
|
|
|
.payload_len = htons(datalen), |
|
|
|
.nexthdr = IPPROTO_UDP, |
|
|
|
.hop_limit = 64, |
|
|
|
.hop_limit = net->ipv6.devconf_dflt->hop_limit, |
|
|
|
}; |
|
|
|
memcpy(&ih->saddr, src->u.ipv6, sizeof(ih->saddr)); |
|
|
|
memcpy(&ih->daddr, dst->u.ipv6, sizeof(ih->daddr)); |
|
|
|
|
|
|
|
skb->protocol = htons(ETH_P_IPV6); |
|
|
|
|
|
|
|
net = NULL; |
|
|
|
if (par) |
|
|
|
net = PAR_STATE_NET(par); |
|
|
|
if (!net && current && current->nsproxy) |
|
|
|
net = current->nsproxy->net_ns; |
|
|
|
if (!net) |
|
|
|
goto drop; |
|
|
|
|
|
|
|
// honour the IPv6 hop limit set via sysctl |
|
|
|
ih->hop_limit = net->ipv6.devconf_dflt->hop_limit; |
|
|
|
|
|
|
|
memset(&fl6, 0, sizeof(fl6)); |
|
|
|
memcpy(&fl6.saddr, src->u.ipv6, sizeof(fl6.saddr)); |
|
|
|
memcpy(&fl6.daddr, dst->u.ipv6, sizeof(fl6.daddr)); |
|
|
|
|