diff options
| author | David S. Miller <davem@davemloft.net> | 2010-01-11 01:55:03 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-01-11 01:55:03 -0500 |
| commit | d4a66e752d0b19934dd208884f8605fe385aaaa9 (patch) | |
| tree | 72fb727be1d7636aae9cddfe9aa93ac9dec75daf /net | |
| parent | bdbec4b86ee99b020e159f9bd604003a3ae3b0ab (diff) | |
| parent | fa15e99b6bb44aa86b241a43ca8c509e91f80153 (diff) | |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/benet/be_cmds.h
include/linux/sysctl.h
Diffstat (limited to 'net')
| -rw-r--r-- | net/bridge/netfilter/ebtables.c | 6 | ||||
| -rw-r--r-- | net/core/pktgen.c | 9 | ||||
| -rw-r--r-- | net/core/sock.c | 4 | ||||
| -rw-r--r-- | net/ipv4/devinet.c | 1 | ||||
| -rw-r--r-- | net/ipv4/fib_frontend.c | 2 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6_output.c | 3 | ||||
| -rw-r--r-- | net/netfilter/ipvs/Kconfig | 3 | ||||
| -rw-r--r-- | net/netfilter/ipvs/ip_vs_ctl.c | 14 | ||||
| -rw-r--r-- | net/netfilter/ipvs/ip_vs_wrr.c | 15 | ||||
| -rw-r--r-- | net/netfilter/nf_conntrack_ftp.c | 18 | ||||
| -rw-r--r-- | net/rose/rose_loopback.c | 2 | ||||
| -rw-r--r-- | net/sctp/socket.c | 3 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 2 |
14 files changed, 50 insertions, 34 deletions
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index bd1c65425d4f..0b7f262cd148 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
| @@ -1406,6 +1406,9 @@ static int do_ebt_set_ctl(struct sock *sk, | |||
| 1406 | { | 1406 | { |
| 1407 | int ret; | 1407 | int ret; |
| 1408 | 1408 | ||
| 1409 | if (!capable(CAP_NET_ADMIN)) | ||
| 1410 | return -EPERM; | ||
| 1411 | |||
| 1409 | switch(cmd) { | 1412 | switch(cmd) { |
| 1410 | case EBT_SO_SET_ENTRIES: | 1413 | case EBT_SO_SET_ENTRIES: |
| 1411 | ret = do_replace(sock_net(sk), user, len); | 1414 | ret = do_replace(sock_net(sk), user, len); |
| @@ -1425,6 +1428,9 @@ static int do_ebt_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) | |||
| 1425 | struct ebt_replace tmp; | 1428 | struct ebt_replace tmp; |
| 1426 | struct ebt_table *t; | 1429 | struct ebt_table *t; |
| 1427 | 1430 | ||
| 1431 | if (!capable(CAP_NET_ADMIN)) | ||
| 1432 | return -EPERM; | ||
| 1433 | |||
| 1428 | if (copy_from_user(&tmp, user, sizeof(tmp))) | 1434 | if (copy_from_user(&tmp, user, sizeof(tmp))) |
| 1429 | return -EFAULT; | 1435 | return -EFAULT; |
| 1430 | 1436 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index a23b45f08ec9..de0c2c726420 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -250,8 +250,7 @@ struct pktgen_dev { | |||
| 250 | __u64 count; /* Default No packets to send */ | 250 | __u64 count; /* Default No packets to send */ |
| 251 | __u64 sofar; /* How many pkts we've sent so far */ | 251 | __u64 sofar; /* How many pkts we've sent so far */ |
| 252 | __u64 tx_bytes; /* How many bytes we've transmitted */ | 252 | __u64 tx_bytes; /* How many bytes we've transmitted */ |
| 253 | __u64 errors; /* Errors when trying to transmit, | 253 | __u64 errors; /* Errors when trying to transmit, */ |
| 254 | pkts will be re-sent */ | ||
| 255 | 254 | ||
| 256 | /* runtime counters relating to clone_skb */ | 255 | /* runtime counters relating to clone_skb */ |
| 257 | 256 | ||
| @@ -3465,6 +3464,12 @@ static void pktgen_xmit(struct pktgen_dev *pkt_dev) | |||
| 3465 | pkt_dev->seq_num++; | 3464 | pkt_dev->seq_num++; |
| 3466 | pkt_dev->tx_bytes += pkt_dev->last_pkt_size; | 3465 | pkt_dev->tx_bytes += pkt_dev->last_pkt_size; |
| 3467 | break; | 3466 | break; |
| 3467 | case NET_XMIT_DROP: | ||
| 3468 | case NET_XMIT_CN: | ||
| 3469 | case NET_XMIT_POLICED: | ||
| 3470 | /* skb has been consumed */ | ||
| 3471 | pkt_dev->errors++; | ||
| 3472 | break; | ||
| 3468 | default: /* Drivers are not supposed to return other values! */ | 3473 | default: /* Drivers are not supposed to return other values! */ |
| 3469 | if (net_ratelimit()) | 3474 | if (net_ratelimit()) |
| 3470 | pr_info("pktgen: %s xmit error: %d\n", | 3475 | pr_info("pktgen: %s xmit error: %d\n", |
diff --git a/net/core/sock.c b/net/core/sock.c index 76ff58d43e26..e1f6f225f012 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1205,6 +1205,10 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | |||
| 1205 | 1205 | ||
| 1206 | if (newsk->sk_prot->sockets_allocated) | 1206 | if (newsk->sk_prot->sockets_allocated) |
| 1207 | percpu_counter_inc(newsk->sk_prot->sockets_allocated); | 1207 | percpu_counter_inc(newsk->sk_prot->sockets_allocated); |
| 1208 | |||
| 1209 | if (sock_flag(newsk, SOCK_TIMESTAMP) || | ||
| 1210 | sock_flag(newsk, SOCK_TIMESTAMPING_RX_SOFTWARE)) | ||
| 1211 | net_enable_timestamp(); | ||
| 1208 | } | 1212 | } |
| 1209 | out: | 1213 | out: |
| 1210 | return newsk; | 1214 | return newsk; |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 0715f4cac391..cd71a3908391 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -1397,6 +1397,7 @@ static struct devinet_sysctl_table { | |||
| 1397 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE, | 1397 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_SOURCE_ROUTE, |
| 1398 | "accept_source_route"), | 1398 | "accept_source_route"), |
| 1399 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"), | 1399 | DEVINET_SYSCTL_RW_ENTRY(ACCEPT_LOCAL, "accept_local"), |
| 1400 | DEVINET_SYSCTL_RW_ENTRY(SRC_VMARK, "src_valid_mark"), | ||
| 1400 | DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"), | 1401 | DEVINET_SYSCTL_RW_ENTRY(PROXY_ARP, "proxy_arp"), |
| 1401 | DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"), | 1402 | DEVINET_SYSCTL_RW_ENTRY(MEDIUM_ID, "medium_id"), |
| 1402 | DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"), | 1403 | DEVINET_SYSCTL_RW_ENTRY(BOOTP_RELAY, "bootp_relay"), |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index 3323168ee52d..82dbf711d6d0 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
| @@ -252,6 +252,8 @@ int fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, | |||
| 252 | no_addr = in_dev->ifa_list == NULL; | 252 | no_addr = in_dev->ifa_list == NULL; |
| 253 | rpf = IN_DEV_RPFILTER(in_dev); | 253 | rpf = IN_DEV_RPFILTER(in_dev); |
| 254 | accept_local = IN_DEV_ACCEPT_LOCAL(in_dev); | 254 | accept_local = IN_DEV_ACCEPT_LOCAL(in_dev); |
| 255 | if (mark && !IN_DEV_SRC_VMARK(in_dev)) | ||
| 256 | fl.mark = 0; | ||
| 255 | } | 257 | } |
| 256 | rcu_read_unlock(); | 258 | rcu_read_unlock(); |
| 257 | 259 | ||
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index e34013a78ef4..3451799e3dbf 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -254,7 +254,7 @@ int ip_mc_output(struct sk_buff *skb) | |||
| 254 | */ | 254 | */ |
| 255 | 255 | ||
| 256 | if (rt->rt_flags&RTCF_MULTICAST) { | 256 | if (rt->rt_flags&RTCF_MULTICAST) { |
| 257 | if ((!sk || inet_sk(sk)->mc_loop) | 257 | if (sk_mc_loop(sk) |
| 258 | #ifdef CONFIG_IP_MROUTE | 258 | #ifdef CONFIG_IP_MROUTE |
| 259 | /* Small optimization: do not loopback not local frames, | 259 | /* Small optimization: do not loopback not local frames, |
| 260 | which returned after forwarding; they will be dropped | 260 | which returned after forwarding; they will be dropped |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index cd48801a8d6f..eb6d09728633 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -121,10 +121,9 @@ static int ip6_output2(struct sk_buff *skb) | |||
| 121 | skb->dev = dev; | 121 | skb->dev = dev; |
| 122 | 122 | ||
| 123 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { | 123 | if (ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)) { |
| 124 | struct ipv6_pinfo* np = skb->sk ? inet6_sk(skb->sk) : NULL; | ||
| 125 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); | 124 | struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb)); |
| 126 | 125 | ||
| 127 | if (!(dev->flags & IFF_LOOPBACK) && (!np || np->mc_loop) && | 126 | if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(skb->sk) && |
| 128 | ((mroute6_socket(dev_net(dev)) && | 127 | ((mroute6_socket(dev_net(dev)) && |
| 129 | !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) || | 128 | !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) || |
| 130 | ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr, | 129 | ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr, |
diff --git a/net/netfilter/ipvs/Kconfig b/net/netfilter/ipvs/Kconfig index 79a698052218..f2d76238b9b5 100644 --- a/net/netfilter/ipvs/Kconfig +++ b/net/netfilter/ipvs/Kconfig | |||
| @@ -112,7 +112,8 @@ config IP_VS_RR | |||
| 112 | module, choose M here. If unsure, say N. | 112 | module, choose M here. If unsure, say N. |
| 113 | 113 | ||
| 114 | config IP_VS_WRR | 114 | config IP_VS_WRR |
| 115 | tristate "weighted round-robin scheduling" | 115 | tristate "weighted round-robin scheduling" |
| 116 | select GCD | ||
| 116 | ---help--- | 117 | ---help--- |
| 117 | The weighted robin-robin scheduling algorithm directs network | 118 | The weighted robin-robin scheduling algorithm directs network |
| 118 | connections to different real servers based on server weights | 119 | connections to different real servers based on server weights |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 6bde12da2fe0..c37ac2d7bec4 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -2077,6 +2077,10 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) | |||
| 2077 | if (!capable(CAP_NET_ADMIN)) | 2077 | if (!capable(CAP_NET_ADMIN)) |
| 2078 | return -EPERM; | 2078 | return -EPERM; |
| 2079 | 2079 | ||
| 2080 | if (cmd < IP_VS_BASE_CTL || cmd > IP_VS_SO_SET_MAX) | ||
| 2081 | return -EINVAL; | ||
| 2082 | if (len < 0 || len > MAX_ARG_LEN) | ||
| 2083 | return -EINVAL; | ||
| 2080 | if (len != set_arglen[SET_CMDID(cmd)]) { | 2084 | if (len != set_arglen[SET_CMDID(cmd)]) { |
| 2081 | pr_err("set_ctl: len %u != %u\n", | 2085 | pr_err("set_ctl: len %u != %u\n", |
| 2082 | len, set_arglen[SET_CMDID(cmd)]); | 2086 | len, set_arglen[SET_CMDID(cmd)]); |
| @@ -2352,17 +2356,25 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len) | |||
| 2352 | { | 2356 | { |
| 2353 | unsigned char arg[128]; | 2357 | unsigned char arg[128]; |
| 2354 | int ret = 0; | 2358 | int ret = 0; |
| 2359 | unsigned int copylen; | ||
| 2355 | 2360 | ||
| 2356 | if (!capable(CAP_NET_ADMIN)) | 2361 | if (!capable(CAP_NET_ADMIN)) |
| 2357 | return -EPERM; | 2362 | return -EPERM; |
| 2358 | 2363 | ||
| 2364 | if (cmd < IP_VS_BASE_CTL || cmd > IP_VS_SO_GET_MAX) | ||
| 2365 | return -EINVAL; | ||
| 2366 | |||
| 2359 | if (*len < get_arglen[GET_CMDID(cmd)]) { | 2367 | if (*len < get_arglen[GET_CMDID(cmd)]) { |
| 2360 | pr_err("get_ctl: len %u < %u\n", | 2368 | pr_err("get_ctl: len %u < %u\n", |
| 2361 | *len, get_arglen[GET_CMDID(cmd)]); | 2369 | *len, get_arglen[GET_CMDID(cmd)]); |
| 2362 | return -EINVAL; | 2370 | return -EINVAL; |
| 2363 | } | 2371 | } |
| 2364 | 2372 | ||
| 2365 | if (copy_from_user(arg, user, get_arglen[GET_CMDID(cmd)]) != 0) | 2373 | copylen = get_arglen[GET_CMDID(cmd)]; |
| 2374 | if (copylen > 128) | ||
| 2375 | return -EINVAL; | ||
| 2376 | |||
| 2377 | if (copy_from_user(arg, user, copylen) != 0) | ||
| 2366 | return -EFAULT; | 2378 | return -EFAULT; |
| 2367 | 2379 | ||
| 2368 | if (mutex_lock_interruptible(&__ip_vs_mutex)) | 2380 | if (mutex_lock_interruptible(&__ip_vs_mutex)) |
diff --git a/net/netfilter/ipvs/ip_vs_wrr.c b/net/netfilter/ipvs/ip_vs_wrr.c index 6182e8ea0be7..3c115fc19784 100644 --- a/net/netfilter/ipvs/ip_vs_wrr.c +++ b/net/netfilter/ipvs/ip_vs_wrr.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/module.h> | 24 | #include <linux/module.h> |
| 25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
| 26 | #include <linux/net.h> | 26 | #include <linux/net.h> |
| 27 | #include <linux/gcd.h> | ||
| 27 | 28 | ||
| 28 | #include <net/ip_vs.h> | 29 | #include <net/ip_vs.h> |
| 29 | 30 | ||
| @@ -38,20 +39,6 @@ struct ip_vs_wrr_mark { | |||
| 38 | }; | 39 | }; |
| 39 | 40 | ||
| 40 | 41 | ||
| 41 | /* | ||
| 42 | * Get the gcd of server weights | ||
| 43 | */ | ||
| 44 | static int gcd(int a, int b) | ||
| 45 | { | ||
| 46 | int c; | ||
| 47 | |||
| 48 | while ((c = a % b)) { | ||
| 49 | a = b; | ||
| 50 | b = c; | ||
| 51 | } | ||
| 52 | return b; | ||
| 53 | } | ||
| 54 | |||
| 55 | static int ip_vs_wrr_gcd_weight(struct ip_vs_service *svc) | 42 | static int ip_vs_wrr_gcd_weight(struct ip_vs_service *svc) |
| 56 | { | 43 | { |
| 57 | struct ip_vs_dest *dest; | 44 | struct ip_vs_dest *dest; |
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index 38ea7ef3ccd2..f0732aa18e4f 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c | |||
| @@ -323,24 +323,24 @@ static void update_nl_seq(struct nf_conn *ct, u32 nl_seq, | |||
| 323 | struct nf_ct_ftp_master *info, int dir, | 323 | struct nf_ct_ftp_master *info, int dir, |
| 324 | struct sk_buff *skb) | 324 | struct sk_buff *skb) |
| 325 | { | 325 | { |
| 326 | unsigned int i, oldest = NUM_SEQ_TO_REMEMBER; | 326 | unsigned int i, oldest; |
| 327 | 327 | ||
| 328 | /* Look for oldest: if we find exact match, we're done. */ | 328 | /* Look for oldest: if we find exact match, we're done. */ |
| 329 | for (i = 0; i < info->seq_aft_nl_num[dir]; i++) { | 329 | for (i = 0; i < info->seq_aft_nl_num[dir]; i++) { |
| 330 | if (info->seq_aft_nl[dir][i] == nl_seq) | 330 | if (info->seq_aft_nl[dir][i] == nl_seq) |
| 331 | return; | 331 | return; |
| 332 | |||
| 333 | if (oldest == info->seq_aft_nl_num[dir] || | ||
| 334 | before(info->seq_aft_nl[dir][i], | ||
| 335 | info->seq_aft_nl[dir][oldest])) | ||
| 336 | oldest = i; | ||
| 337 | } | 332 | } |
| 338 | 333 | ||
| 339 | if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { | 334 | if (info->seq_aft_nl_num[dir] < NUM_SEQ_TO_REMEMBER) { |
| 340 | info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; | 335 | info->seq_aft_nl[dir][info->seq_aft_nl_num[dir]++] = nl_seq; |
| 341 | } else if (oldest != NUM_SEQ_TO_REMEMBER && | 336 | } else { |
| 342 | after(nl_seq, info->seq_aft_nl[dir][oldest])) { | 337 | if (before(info->seq_aft_nl[dir][0], info->seq_aft_nl[dir][1])) |
| 343 | info->seq_aft_nl[dir][oldest] = nl_seq; | 338 | oldest = 0; |
| 339 | else | ||
| 340 | oldest = 1; | ||
| 341 | |||
| 342 | if (after(nl_seq, info->seq_aft_nl[dir][oldest])) | ||
| 343 | info->seq_aft_nl[dir][oldest] = nl_seq; | ||
| 344 | } | 344 | } |
| 345 | } | 345 | } |
| 346 | 346 | ||
diff --git a/net/rose/rose_loopback.c b/net/rose/rose_loopback.c index 114df6eec8c3..968e8bac1b5d 100644 --- a/net/rose/rose_loopback.c +++ b/net/rose/rose_loopback.c | |||
| @@ -75,7 +75,7 @@ static void rose_loopback_timer(unsigned long param) | |||
| 75 | lci_i = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF); | 75 | lci_i = ((skb->data[0] << 8) & 0xF00) + ((skb->data[1] << 0) & 0x0FF); |
| 76 | frametype = skb->data[2]; | 76 | frametype = skb->data[2]; |
| 77 | dest = (rose_address *)(skb->data + 4); | 77 | dest = (rose_address *)(skb->data + 4); |
| 78 | lci_o = 0xFFF - lci_i; | 78 | lci_o = ROSE_DEFAULT_MAXVC + 1 - lci_i; |
| 79 | 79 | ||
| 80 | skb_reset_transport_header(skb); | 80 | skb_reset_transport_header(skb); |
| 81 | 81 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 89ab66e54740..67fdac9d2d33 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -2087,8 +2087,7 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | |||
| 2087 | if (copy_from_user(&sp->autoclose, optval, optlen)) | 2087 | if (copy_from_user(&sp->autoclose, optval, optlen)) |
| 2088 | return -EFAULT; | 2088 | return -EFAULT; |
| 2089 | /* make sure it won't exceed MAX_SCHEDULE_TIMEOUT */ | 2089 | /* make sure it won't exceed MAX_SCHEDULE_TIMEOUT */ |
| 2090 | if (sp->autoclose > (MAX_SCHEDULE_TIMEOUT / HZ) ) | 2090 | sp->autoclose = min_t(long, sp->autoclose, MAX_SCHEDULE_TIMEOUT / HZ); |
| 2091 | sp->autoclose = (__u32)(MAX_SCHEDULE_TIMEOUT / HZ) ; | ||
| 2092 | 2091 | ||
| 2093 | return 0; | 2092 | return 0; |
| 2094 | } | 2093 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index cb81ca35b0d6..4725a549ad4d 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -1445,7 +1445,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy, | |||
| 1445 | if (!dev) | 1445 | if (!dev) |
| 1446 | goto free_dst; | 1446 | goto free_dst; |
| 1447 | 1447 | ||
| 1448 | /* Copy neighbout for reachability confirmation */ | 1448 | /* Copy neighbour for reachability confirmation */ |
| 1449 | dst0->neighbour = neigh_clone(dst->neighbour); | 1449 | dst0->neighbour = neigh_clone(dst->neighbour); |
| 1450 | 1450 | ||
| 1451 | xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len); | 1451 | xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len); |
