|
@@ -1766,13 +1766,22 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg)
|
|
|
* Drop the packet on the floor
|
|
|
*/
|
|
|
|
|
|
-static inline int ip6_pkt_drop(struct sk_buff *skb, int code)
|
|
|
-{
|
|
|
- int type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
|
|
|
- if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED)
|
|
|
- IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INADDRERRORS);
|
|
|
-
|
|
|
- IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_OUTNOROUTES);
|
|
|
+static inline int ip6_pkt_drop(struct sk_buff *skb, int code,
|
|
|
+ int ipstats_mib_noroutes)
|
|
|
+{
|
|
|
+ int type;
|
|
|
+ switch (ipstats_mib_noroutes) {
|
|
|
+ case IPSTATS_MIB_INNOROUTES:
|
|
|
+ type = ipv6_addr_type(&skb->nh.ipv6h->daddr);
|
|
|
+ if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) {
|
|
|
+ IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INADDRERRORS);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ /* FALLTHROUGH */
|
|
|
+ case IPSTATS_MIB_OUTNOROUTES:
|
|
|
+ IP6_INC_STATS(ip6_dst_idev(skb->dst), ipstats_mib_noroutes);
|
|
|
+ break;
|
|
|
+ }
|
|
|
icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0, skb->dev);
|
|
|
kfree_skb(skb);
|
|
|
return 0;
|
|
@@ -1780,26 +1789,26 @@ static inline int ip6_pkt_drop(struct sk_buff *skb, int code)
|
|
|
|
|
|
static int ip6_pkt_discard(struct sk_buff *skb)
|
|
|
{
|
|
|
- return ip6_pkt_drop(skb, ICMPV6_NOROUTE);
|
|
|
+ return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES);
|
|
|
}
|
|
|
|
|
|
static int ip6_pkt_discard_out(struct sk_buff *skb)
|
|
|
{
|
|
|
skb->dev = skb->dst->dev;
|
|
|
- return ip6_pkt_discard(skb);
|
|
|
+ return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
|
|
|
|
|
|
static int ip6_pkt_prohibit(struct sk_buff *skb)
|
|
|
{
|
|
|
- return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED);
|
|
|
+ return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES);
|
|
|
}
|
|
|
|
|
|
static int ip6_pkt_prohibit_out(struct sk_buff *skb)
|
|
|
{
|
|
|
skb->dev = skb->dst->dev;
|
|
|
- return ip6_pkt_prohibit(skb);
|
|
|
+ return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
|
|
|
}
|
|
|
|
|
|
static int ip6_pkt_blk_hole(struct sk_buff *skb)
|