links to the description of driver-specific traps registered by various device
  drivers:
  
 -  * :doc:`netdevsim`
 -  * :doc:`mlxsw`
 -  * :doc:`prestera`
 +  * Documentation/networking/devlink/netdevsim.rst
 +  * Documentation/networking/devlink/mlxsw.rst
++  * Documentation/networking/devlink/prestera.rst
  
  .. _Generic-Packet-Trap-Groups:
  
 
        sctp_transport_put(t);
  }
  
+ static void sctp_v4_err_handle(struct sctp_transport *t, struct sk_buff *skb,
+                              __u8 type, __u8 code, __u32 info)
+ {
+       struct sctp_association *asoc = t->asoc;
+       struct sock *sk = asoc->base.sk;
+       int err = 0;
+ 
+       switch (type) {
+       case ICMP_PARAMETERPROB:
+               err = EPROTO;
+               break;
+       case ICMP_DEST_UNREACH:
+               if (code > NR_ICMP_UNREACH)
+                       return;
+               if (code == ICMP_FRAG_NEEDED) {
+                       sctp_icmp_frag_needed(sk, asoc, t, SCTP_TRUNC4(info));
+                       return;
+               }
+               if (code == ICMP_PROT_UNREACH) {
+                       sctp_icmp_proto_unreachable(sk, asoc, t);
+                       return;
+               }
+               err = icmp_err_convert[code].errno;
+               break;
+       case ICMP_TIME_EXCEEDED:
+               if (code == ICMP_EXC_FRAGTIME)
+                       return;
+ 
+               err = EHOSTUNREACH;
+               break;
+       case ICMP_REDIRECT:
+               sctp_icmp_redirect(sk, t, skb);
++              return;
+       default:
+               return;
+       }
+       if (!sock_owned_by_user(sk) && inet_sk(sk)->recverr) {
+               sk->sk_err = err;
+               sk_error_report(sk);
+       } else {  /* Only an error on timeout */
+               sk->sk_err_soft = err;
+       }
+ }
+ 
  /*
   * This routine is called by the ICMP module when it gets some
   * sort of error condition.  If err < 0 then the socket should