ipv6: Add an ICMP error handler icmpv6_err
Subsystems (3)
PATCH 1/1 ipv6: Add an ICMP error handler icmpv6_err
Add an ICMP error handler icmpv6_err to deal with ICMPV6 Error Messages and Redirect Message, when we do not have a socket context.
Signed-off-by Duan Jiong <[email protected]>
--- net/ipv6/icmp.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
net/ipv6/icmp.c +23 -0
@@ -82,9 +82,12 @@ static inline struct sock *icmpv6_sk(struct net *net) }static int icmpv6_rcv (struct sk_buff *skb); +static void icmpv6_err (struct sk_buff *skb,struct inet6_skb_parm *opt, +u8 type,u8 code,int offset,__be32 info);static const struct inet6_protocol icmpv6_protocol = { .handler = icmpv6_rcv, + .err_handler = icmpv6_err, .flags =INET6_PROTO_NOPOLICY |INET6_PROTO_FINAL , };
@@ -782,6 +785,26 @@ drop_no_count:return 0 ; } +static void icmpv6_err (struct sk_buff *skb,struct inet6_skb_parm *opt, +u8 type,u8 code,int offset,__be32 info) +{ +struct net *net =dev_net (skb->dev); +struct icmp6hdr *hdr =icmp6_hdr (skb); + +switch (hdr->icmp6_type) { +case ICMPV6_PKT_TOOBIG : +ip6_update_pmtu (skb, net, info,0 ,0 ); +break ; + +case NDISC_REDIRECT : +ip6_redirect (skb, net,0 ,0 ); +break ; + +default : +break ; + } +} + void icmpv6_flow_init(struct sock *sk, struct flowi6 *fl6, u8 type, const struct in6_addr *saddr,
Signature · 1 line
1.7.11.4
Quoted 41 lines · Duan Jiong
Add an ICMP error handler
icmpv6_errto deal with ICMPV6 Error Messages and Redirect Message, when we do not have a socket context.Signed-off-by Duan Jiong <[email protected]>--- net/ipv6/icmp.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)net/ipv6/icmp.c +13
-0@@ -82,9 +82,12 @@ static inline struct sock *icmpv6_sk(struct net *net) }static int icmpv6_rcv (struct sk_buff *skb); +static void icmpv6_err (struct sk_buff *skb,struct inet6_skb_parm *opt, +u8 type,u8 code,int offset,__be32 info);static const struct inet6_protocol icmpv6_protocol = { .handler = icmpv6_rcv, + .err_handler = icmpv6_err, .flags =INET6_PROTO_NOPOLICY |INET6_PROTO_FINAL , };@@ -782,6 +785,26 @@ drop_no_count:return 0 ; } +static void icmpv6_err (struct sk_buff *skb,struct inet6_skb_parm *opt, +u8 type,u8 code,int offset,__be32 info) +{ +struct net *net =dev_net (skb->dev); +struct icmp6hdr *hdr =icmp6_hdr (skb); + +switch (hdr->icmp6_type) { +case ICMPV6_PKT_TOOBIG : +ip6_update_pmtu (skb, net, info,0 ,0 ); +break ;
net/ipv6/icmp.c drop_no_count: · line 807
Quoted 10 lines
net/ipv6/icmp.c +10
-0+ +case NDISC_REDIRECT : +ip6_redirect (skb, net,0 ,0 ); +break ; + +default : +break ; + } +} +
Not sure if it really matters, but the ip6_update_pmtu/ip6_redirect function would be called twice if we have (raw) socket context. Maybe it's better to do this in raw6_icmp_error() if we have no socket context.