sctp_icmp_proto_unreachable(sk, ep, asoc, transport);
sctp_icmp_proto_unreachable(sk, asoc, transport);
SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,			     int type, int code, int offset, __u32 info){	struct inet6_dev *idev;	struct ipv6hdr *iph = (struct ipv6hdr *)skb->data;	struct sctphdr *sh = (struct sctphdr *)(skb->data + offset);	struct sock *sk;	struct sctp_endpoint *ep;	struct sctp_association *asoc;	struct sctp_transport *transport;	struct ipv6_pinfo *np;	char *saveip, *savesctp;	int err;	idev = in6_dev_get(skb->dev);	/* Fix up skb to look at the embedded net header. */	saveip = skb->nh.raw;	savesctp  = skb->h.raw;	skb->nh.ipv6h = iph;	skb->h.raw = (char *)sh;	sk = sctp_err_lookup(AF_INET6, skb, sh, &ep, &asoc, &transport);	/* Put back, the original pointers. */	skb->nh.raw = saveip;	skb->h.raw = savesctp;	if (!sk) {		ICMP6_INC_STATS_BH(idev, ICMP6_MIB_INERRORS);		goto out;	}	/* Warning:  The sock lock is held.  Remember to call	 * sctp_err_finish!	 */	switch (type) {	case ICMPV6_PKT_TOOBIG:		sctp_icmp_frag_needed(sk, asoc, transport, ntohl(info));		goto out_unlock;	case ICMPV6_PARAMPROB:		if (ICMPV6_UNK_NEXTHDR == code) {			sctp_icmp_proto_unreachable(sk, ep, asoc, transport);			goto out_unlock;		}		break;	default:		break;	}	np = inet6_sk(sk);	icmpv6_err_convert(type, code, &err);	if (!sock_owned_by_user(sk) && np->recverr) {		sk->sk_err = err;		sk->sk_error_report(sk);	} else {  /* Only an error on timeout */		sk->sk_err_soft = err;	}out_unlock:	sctp_err_finish(sk, ep, asoc);out:	if (likely(idev != NULL))		in6_dev_put(idev);}