When sending in ICMP response to an SCTP packet,
* include the SCTP common header, if possible * include the first 8 bytes of the INIT chunk, if possible This provides the necesary information for the receiver of the ICMP packet to process it. MFC after: 1 week
This commit is contained in:
parent
d38447b51d
commit
f88d0cfe7a
@ -61,6 +61,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <netinet/ip_icmp.h>
|
#include <netinet/ip_icmp.h>
|
||||||
#include <netinet/ip_var.h>
|
#include <netinet/ip_var.h>
|
||||||
#include <netinet/ip_options.h>
|
#include <netinet/ip_options.h>
|
||||||
|
#include <netinet/sctp.h>
|
||||||
#include <netinet/tcp.h>
|
#include <netinet/tcp.h>
|
||||||
#include <netinet/tcp_var.h>
|
#include <netinet/tcp_var.h>
|
||||||
#include <netinet/tcpip.h>
|
#include <netinet/tcpip.h>
|
||||||
@ -249,6 +250,34 @@ icmp_error(struct mbuf *n, int type, int code, uint32_t dest, int mtu)
|
|||||||
goto freeit;
|
goto freeit;
|
||||||
icmpelen = max(tcphlen, min(V_icmp_quotelen,
|
icmpelen = max(tcphlen, min(V_icmp_quotelen,
|
||||||
ntohs(oip->ip_len) - oiphlen));
|
ntohs(oip->ip_len) - oiphlen));
|
||||||
|
} else if (oip->ip_p == IPPROTO_SCTP) {
|
||||||
|
struct sctphdr *sh;
|
||||||
|
struct sctp_chunkhdr *ch;
|
||||||
|
|
||||||
|
if (ntohs(oip->ip_len) < oiphlen + sizeof(struct sctphdr))
|
||||||
|
goto stdreply;
|
||||||
|
if (oiphlen + sizeof(struct sctphdr) > n->m_len &&
|
||||||
|
n->m_next == NULL)
|
||||||
|
goto stdreply;
|
||||||
|
if (n->m_len < oiphlen + sizeof(struct sctphdr) &&
|
||||||
|
(n = m_pullup(n, oiphlen + sizeof(struct sctphdr))) == NULL)
|
||||||
|
goto freeit;
|
||||||
|
icmpelen = max(sizeof(struct sctphdr),
|
||||||
|
min(V_icmp_quotelen, ntohs(oip->ip_len) - oiphlen));
|
||||||
|
sh = (struct sctphdr *)((caddr_t)oip + oiphlen);
|
||||||
|
if (ntohl(sh->v_tag) == 0 &&
|
||||||
|
ntohs(oip->ip_len) >= oiphlen + sizeof(struct sctphdr) + 8 &&
|
||||||
|
(n->m_len >= oiphlen + sizeof(struct sctphdr) + 8 ||
|
||||||
|
n->m_next != NULL)) {
|
||||||
|
if (n->m_len < oiphlen + sizeof(struct sctphdr) + 8 &&
|
||||||
|
(n = m_pullup(n, oiphlen + sizeof(struct sctphdr) + 8)) == NULL)
|
||||||
|
goto freeit;
|
||||||
|
ch = (struct sctp_chunkhdr *)(sh + 1);
|
||||||
|
if (ch->chunk_type == SCTP_INITIATION) {
|
||||||
|
icmpelen = max(sizeof(struct sctphdr) + 8,
|
||||||
|
min(V_icmp_quotelen, ntohs(oip->ip_len) - oiphlen));
|
||||||
|
}
|
||||||
|
}
|
||||||
} else
|
} else
|
||||||
stdreply: icmpelen = max(8, min(V_icmp_quotelen, ntohs(oip->ip_len) - oiphlen));
|
stdreply: icmpelen = max(8, min(V_icmp_quotelen, ntohs(oip->ip_len) - oiphlen));
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user