diff options
| -rw-r--r-- | net/ipv6/route.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index ad9b285692ba..aebb4e2d5ae3 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -1766,13 +1766,22 @@ int ipv6_route_ioctl(unsigned int cmd, void __user *arg) | |||
| 1766 | * Drop the packet on the floor | 1766 | * Drop the packet on the floor |
| 1767 | */ | 1767 | */ |
| 1768 | 1768 | ||
| 1769 | static inline int ip6_pkt_drop(struct sk_buff *skb, int code) | 1769 | static inline int ip6_pkt_drop(struct sk_buff *skb, int code, |
| 1770 | { | 1770 | int ipstats_mib_noroutes) |
| 1771 | int type = ipv6_addr_type(&skb->nh.ipv6h->daddr); | 1771 | { |
| 1772 | if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) | 1772 | int type; |
| 1773 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INADDRERRORS); | 1773 | switch (ipstats_mib_noroutes) { |
| 1774 | 1774 | case IPSTATS_MIB_INNOROUTES: | |
| 1775 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_OUTNOROUTES); | 1775 | type = ipv6_addr_type(&skb->nh.ipv6h->daddr); |
| 1776 | if (type == IPV6_ADDR_ANY || type == IPV6_ADDR_RESERVED) { | ||
| 1777 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_INADDRERRORS); | ||
| 1778 | break; | ||
| 1779 | } | ||
| 1780 | /* FALLTHROUGH */ | ||
| 1781 | case IPSTATS_MIB_OUTNOROUTES: | ||
| 1782 | IP6_INC_STATS(ip6_dst_idev(skb->dst), ipstats_mib_noroutes); | ||
| 1783 | break; | ||
| 1784 | } | ||
| 1776 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0, skb->dev); | 1785 | icmpv6_send(skb, ICMPV6_DEST_UNREACH, code, 0, skb->dev); |
| 1777 | kfree_skb(skb); | 1786 | kfree_skb(skb); |
| 1778 | return 0; | 1787 | return 0; |
| @@ -1780,26 +1789,26 @@ static inline int ip6_pkt_drop(struct sk_buff *skb, int code) | |||
| 1780 | 1789 | ||
| 1781 | static int ip6_pkt_discard(struct sk_buff *skb) | 1790 | static int ip6_pkt_discard(struct sk_buff *skb) |
| 1782 | { | 1791 | { |
| 1783 | return ip6_pkt_drop(skb, ICMPV6_NOROUTE); | 1792 | return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_INNOROUTES); |
| 1784 | } | 1793 | } |
| 1785 | 1794 | ||
| 1786 | static int ip6_pkt_discard_out(struct sk_buff *skb) | 1795 | static int ip6_pkt_discard_out(struct sk_buff *skb) |
| 1787 | { | 1796 | { |
| 1788 | skb->dev = skb->dst->dev; | 1797 | skb->dev = skb->dst->dev; |
| 1789 | return ip6_pkt_discard(skb); | 1798 | return ip6_pkt_drop(skb, ICMPV6_NOROUTE, IPSTATS_MIB_OUTNOROUTES); |
| 1790 | } | 1799 | } |
| 1791 | 1800 | ||
| 1792 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 1801 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
| 1793 | 1802 | ||
| 1794 | static int ip6_pkt_prohibit(struct sk_buff *skb) | 1803 | static int ip6_pkt_prohibit(struct sk_buff *skb) |
| 1795 | { | 1804 | { |
| 1796 | return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED); | 1805 | return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_INNOROUTES); |
| 1797 | } | 1806 | } |
| 1798 | 1807 | ||
| 1799 | static int ip6_pkt_prohibit_out(struct sk_buff *skb) | 1808 | static int ip6_pkt_prohibit_out(struct sk_buff *skb) |
| 1800 | { | 1809 | { |
| 1801 | skb->dev = skb->dst->dev; | 1810 | skb->dev = skb->dst->dev; |
| 1802 | return ip6_pkt_prohibit(skb); | 1811 | return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES); |
| 1803 | } | 1812 | } |
| 1804 | 1813 | ||
| 1805 | static int ip6_pkt_blk_hole(struct sk_buff *skb) | 1814 | static int ip6_pkt_blk_hole(struct sk_buff *skb) |
