mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
ipv6: Convert to use flowi6 where applicable.
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9cce96df5b
commit
4c9483b2fb
35 changed files with 622 additions and 620 deletions
|
@ -174,15 +174,15 @@ int ip6_output(struct sk_buff *skb)
|
|||
* xmit an sk_buff (used by TCP, SCTP and DCCP)
|
||||
*/
|
||||
|
||||
int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
|
||||
int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6,
|
||||
struct ipv6_txoptions *opt)
|
||||
{
|
||||
struct net *net = sock_net(sk);
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct in6_addr *first_hop = &fl->fl6_dst;
|
||||
struct in6_addr *first_hop = &fl6->daddr;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct ipv6hdr *hdr;
|
||||
u8 proto = fl->flowi_proto;
|
||||
u8 proto = fl6->flowi6_proto;
|
||||
int seg_len = skb->len;
|
||||
int hlimit = -1;
|
||||
int tclass = 0;
|
||||
|
@ -230,13 +230,13 @@ int ip6_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
|
|||
if (hlimit < 0)
|
||||
hlimit = ip6_dst_hoplimit(dst);
|
||||
|
||||
*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl->fl6_flowlabel;
|
||||
*(__be32 *)hdr = htonl(0x60000000 | (tclass << 20)) | fl6->flowlabel;
|
||||
|
||||
hdr->payload_len = htons(seg_len);
|
||||
hdr->nexthdr = proto;
|
||||
hdr->hop_limit = hlimit;
|
||||
|
||||
ipv6_addr_copy(&hdr->saddr, &fl->fl6_src);
|
||||
ipv6_addr_copy(&hdr->saddr, &fl6->saddr);
|
||||
ipv6_addr_copy(&hdr->daddr, first_hop);
|
||||
|
||||
skb->priority = sk->sk_priority;
|
||||
|
@ -879,7 +879,7 @@ static inline int ip6_rt_check(struct rt6key *rt_key,
|
|||
|
||||
static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
|
||||
struct dst_entry *dst,
|
||||
struct flowi *fl)
|
||||
struct flowi6 *fl6)
|
||||
{
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct rt6_info *rt = (struct rt6_info *)dst;
|
||||
|
@ -904,11 +904,11 @@ static struct dst_entry *ip6_sk_dst_check(struct sock *sk,
|
|||
* sockets.
|
||||
* 2. oif also should be the same.
|
||||
*/
|
||||
if (ip6_rt_check(&rt->rt6i_dst, &fl->fl6_dst, np->daddr_cache) ||
|
||||
if (ip6_rt_check(&rt->rt6i_dst, &fl6->daddr, np->daddr_cache) ||
|
||||
#ifdef CONFIG_IPV6_SUBTREES
|
||||
ip6_rt_check(&rt->rt6i_src, &fl->fl6_src, np->saddr_cache) ||
|
||||
ip6_rt_check(&rt->rt6i_src, &fl6->saddr, np->saddr_cache) ||
|
||||
#endif
|
||||
(fl->flowi_oif && fl->flowi_oif != dst->dev->ifindex)) {
|
||||
(fl6->flowi6_oif && fl6->flowi6_oif != dst->dev->ifindex)) {
|
||||
dst_release(dst);
|
||||
dst = NULL;
|
||||
}
|
||||
|
@ -918,22 +918,22 @@ out:
|
|||
}
|
||||
|
||||
static int ip6_dst_lookup_tail(struct sock *sk,
|
||||
struct dst_entry **dst, struct flowi *fl)
|
||||
struct dst_entry **dst, struct flowi6 *fl6)
|
||||
{
|
||||
int err;
|
||||
struct net *net = sock_net(sk);
|
||||
|
||||
if (*dst == NULL)
|
||||
*dst = ip6_route_output(net, sk, fl);
|
||||
*dst = ip6_route_output(net, sk, fl6);
|
||||
|
||||
if ((err = (*dst)->error))
|
||||
goto out_err_release;
|
||||
|
||||
if (ipv6_addr_any(&fl->fl6_src)) {
|
||||
if (ipv6_addr_any(&fl6->saddr)) {
|
||||
err = ipv6_dev_get_saddr(net, ip6_dst_idev(*dst)->dev,
|
||||
&fl->fl6_dst,
|
||||
&fl6->daddr,
|
||||
sk ? inet6_sk(sk)->srcprefs : 0,
|
||||
&fl->fl6_src);
|
||||
&fl6->saddr);
|
||||
if (err)
|
||||
goto out_err_release;
|
||||
}
|
||||
|
@ -949,10 +949,10 @@ static int ip6_dst_lookup_tail(struct sock *sk,
|
|||
*/
|
||||
if ((*dst)->neighbour && !((*dst)->neighbour->nud_state & NUD_VALID)) {
|
||||
struct inet6_ifaddr *ifp;
|
||||
struct flowi fl_gw;
|
||||
struct flowi6 fl_gw6;
|
||||
int redirect;
|
||||
|
||||
ifp = ipv6_get_ifaddr(net, &fl->fl6_src,
|
||||
ifp = ipv6_get_ifaddr(net, &fl6->saddr,
|
||||
(*dst)->dev, 1);
|
||||
|
||||
redirect = (ifp && ifp->flags & IFA_F_OPTIMISTIC);
|
||||
|
@ -965,9 +965,9 @@ static int ip6_dst_lookup_tail(struct sock *sk,
|
|||
* default router instead
|
||||
*/
|
||||
dst_release(*dst);
|
||||
memcpy(&fl_gw, fl, sizeof(struct flowi));
|
||||
memset(&fl_gw.fl6_dst, 0, sizeof(struct in6_addr));
|
||||
*dst = ip6_route_output(net, sk, &fl_gw);
|
||||
memcpy(&fl_gw6, fl6, sizeof(struct flowi6));
|
||||
memset(&fl_gw6.daddr, 0, sizeof(struct in6_addr));
|
||||
*dst = ip6_route_output(net, sk, &fl_gw6);
|
||||
if ((err = (*dst)->error))
|
||||
goto out_err_release;
|
||||
}
|
||||
|
@ -988,23 +988,23 @@ out_err_release:
|
|||
* ip6_dst_lookup - perform route lookup on flow
|
||||
* @sk: socket which provides route info
|
||||
* @dst: pointer to dst_entry * for result
|
||||
* @fl: flow to lookup
|
||||
* @fl6: flow to lookup
|
||||
*
|
||||
* This function performs a route lookup on the given flow.
|
||||
*
|
||||
* It returns zero on success, or a standard errno code on error.
|
||||
*/
|
||||
int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi *fl)
|
||||
int ip6_dst_lookup(struct sock *sk, struct dst_entry **dst, struct flowi6 *fl6)
|
||||
{
|
||||
*dst = NULL;
|
||||
return ip6_dst_lookup_tail(sk, dst, fl);
|
||||
return ip6_dst_lookup_tail(sk, dst, fl6);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_dst_lookup);
|
||||
|
||||
/**
|
||||
* ip6_dst_lookup_flow - perform route lookup on flow with ipsec
|
||||
* @sk: socket which provides route info
|
||||
* @fl: flow to lookup
|
||||
* @fl6: flow to lookup
|
||||
* @final_dst: final destination address for ipsec lookup
|
||||
* @can_sleep: we are in a sleepable context
|
||||
*
|
||||
|
@ -1013,29 +1013,29 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup);
|
|||
* It returns a valid dst pointer on success, or a pointer encoded
|
||||
* error code.
|
||||
*/
|
||||
struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi *fl,
|
||||
struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
|
||||
const struct in6_addr *final_dst,
|
||||
bool can_sleep)
|
||||
{
|
||||
struct dst_entry *dst = NULL;
|
||||
int err;
|
||||
|
||||
err = ip6_dst_lookup_tail(sk, &dst, fl);
|
||||
err = ip6_dst_lookup_tail(sk, &dst, fl6);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
if (final_dst)
|
||||
ipv6_addr_copy(&fl->fl6_dst, final_dst);
|
||||
ipv6_addr_copy(&fl6->daddr, final_dst);
|
||||
if (can_sleep)
|
||||
fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP;
|
||||
fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
|
||||
|
||||
return xfrm_lookup(sock_net(sk), dst, fl, sk, 0);
|
||||
return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
|
||||
|
||||
/**
|
||||
* ip6_sk_dst_lookup_flow - perform socket cached route lookup on flow
|
||||
* @sk: socket which provides the dst cache and route info
|
||||
* @fl: flow to lookup
|
||||
* @fl6: flow to lookup
|
||||
* @final_dst: final destination address for ipsec lookup
|
||||
* @can_sleep: we are in a sleepable context
|
||||
*
|
||||
|
@ -1047,24 +1047,24 @@ EXPORT_SYMBOL_GPL(ip6_dst_lookup_flow);
|
|||
* It returns a valid dst pointer on success, or a pointer encoded
|
||||
* error code.
|
||||
*/
|
||||
struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi *fl,
|
||||
struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi6 *fl6,
|
||||
const struct in6_addr *final_dst,
|
||||
bool can_sleep)
|
||||
{
|
||||
struct dst_entry *dst = sk_dst_check(sk, inet6_sk(sk)->dst_cookie);
|
||||
int err;
|
||||
|
||||
dst = ip6_sk_dst_check(sk, dst, fl);
|
||||
dst = ip6_sk_dst_check(sk, dst, fl6);
|
||||
|
||||
err = ip6_dst_lookup_tail(sk, &dst, fl);
|
||||
err = ip6_dst_lookup_tail(sk, &dst, fl6);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
if (final_dst)
|
||||
ipv6_addr_copy(&fl->fl6_dst, final_dst);
|
||||
ipv6_addr_copy(&fl6->daddr, final_dst);
|
||||
if (can_sleep)
|
||||
fl->flowi_flags |= FLOWI_FLAG_CAN_SLEEP;
|
||||
fl6->flowi6_flags |= FLOWI_FLAG_CAN_SLEEP;
|
||||
|
||||
return xfrm_lookup(sock_net(sk), dst, fl, sk, 0);
|
||||
return xfrm_lookup(sock_net(sk), dst, flowi6_to_flowi(fl6), sk, 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip6_sk_dst_lookup_flow);
|
||||
|
||||
|
@ -1145,7 +1145,7 @@ static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
|
|||
int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
||||
int offset, int len, int odd, struct sk_buff *skb),
|
||||
void *from, int length, int transhdrlen,
|
||||
int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi *fl,
|
||||
int hlimit, int tclass, struct ipv6_txoptions *opt, struct flowi6 *fl6,
|
||||
struct rt6_info *rt, unsigned int flags, int dontfrag)
|
||||
{
|
||||
struct inet_sock *inet = inet_sk(sk);
|
||||
|
@ -1203,7 +1203,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
}
|
||||
dst_hold(&rt->dst);
|
||||
inet->cork.dst = &rt->dst;
|
||||
inet->cork.fl = *fl;
|
||||
inet->cork.fl.u.ip6 = *fl6;
|
||||
np->cork.hop_limit = hlimit;
|
||||
np->cork.tclass = tclass;
|
||||
mtu = np->pmtudisc == IPV6_PMTUDISC_PROBE ?
|
||||
|
@ -1224,7 +1224,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
transhdrlen += exthdrlen;
|
||||
} else {
|
||||
rt = (struct rt6_info *)inet->cork.dst;
|
||||
fl = &inet->cork.fl;
|
||||
fl6 = &inet->cork.fl.u.ip6;
|
||||
opt = np->cork.opt;
|
||||
transhdrlen = 0;
|
||||
exthdrlen = 0;
|
||||
|
@ -1239,7 +1239,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
|
||||
if (mtu <= sizeof(struct ipv6hdr) + IPV6_MAXPLEN) {
|
||||
if (inet->cork.length + length > sizeof(struct ipv6hdr) + IPV6_MAXPLEN - fragheaderlen) {
|
||||
ipv6_local_error(sk, EMSGSIZE, fl, mtu-exthdrlen);
|
||||
ipv6_local_error(sk, EMSGSIZE, fl6, mtu-exthdrlen);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
}
|
||||
|
@ -1271,7 +1271,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
|
|||
if (length > mtu) {
|
||||
int proto = sk->sk_protocol;
|
||||
if (dontfrag && (proto == IPPROTO_UDP || proto == IPPROTO_RAW)){
|
||||
ipv6_local_rxpmtu(sk, fl, mtu-exthdrlen);
|
||||
ipv6_local_rxpmtu(sk, fl6, mtu-exthdrlen);
|
||||
return -EMSGSIZE;
|
||||
}
|
||||
|
||||
|
@ -1516,8 +1516,8 @@ int ip6_push_pending_frames(struct sock *sk)
|
|||
struct ipv6hdr *hdr;
|
||||
struct ipv6_txoptions *opt = np->cork.opt;
|
||||
struct rt6_info *rt = (struct rt6_info *)inet->cork.dst;
|
||||
struct flowi *fl = &inet->cork.fl;
|
||||
unsigned char proto = fl->flowi_proto;
|
||||
struct flowi6 *fl6 = &inet->cork.fl.u.ip6;
|
||||
unsigned char proto = fl6->flowi6_proto;
|
||||
int err = 0;
|
||||
|
||||
if ((skb = __skb_dequeue(&sk->sk_write_queue)) == NULL)
|
||||
|
@ -1542,7 +1542,7 @@ int ip6_push_pending_frames(struct sock *sk)
|
|||
if (np->pmtudisc < IPV6_PMTUDISC_DO)
|
||||
skb->local_df = 1;
|
||||
|
||||
ipv6_addr_copy(final_dst, &fl->fl6_dst);
|
||||
ipv6_addr_copy(final_dst, &fl6->daddr);
|
||||
__skb_pull(skb, skb_network_header_len(skb));
|
||||
if (opt && opt->opt_flen)
|
||||
ipv6_push_frag_opts(skb, opt, &proto);
|
||||
|
@ -1553,12 +1553,12 @@ int ip6_push_pending_frames(struct sock *sk)
|
|||
skb_reset_network_header(skb);
|
||||
hdr = ipv6_hdr(skb);
|
||||
|
||||
*(__be32*)hdr = fl->fl6_flowlabel |
|
||||
*(__be32*)hdr = fl6->flowlabel |
|
||||
htonl(0x60000000 | ((int)np->cork.tclass << 20));
|
||||
|
||||
hdr->hop_limit = np->cork.hop_limit;
|
||||
hdr->nexthdr = proto;
|
||||
ipv6_addr_copy(&hdr->saddr, &fl->fl6_src);
|
||||
ipv6_addr_copy(&hdr->saddr, &fl6->saddr);
|
||||
ipv6_addr_copy(&hdr->daddr, final_dst);
|
||||
|
||||
skb->priority = sk->sk_priority;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue