Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/sctp_usrreq.c
Show First 20 Lines • Show All 254 Lines • ▼ Show 20 Lines | if ((icmp_code == ICMP_UNREACH_NET) || | ||||
} | } | ||||
SCTP_TCB_UNLOCK(stcb); | SCTP_TCB_UNLOCK(stcb); | ||||
} else { | } else { | ||||
SCTP_TCB_UNLOCK(stcb); | SCTP_TCB_UNLOCK(stcb); | ||||
} | } | ||||
} | } | ||||
void | void | ||||
sctp_ctlinput(int cmd, struct sockaddr *sa, void *vip) | sctp_ctlinput(int cmd, struct sockaddr_in *sin, struct ip *ip) | ||||
{ | { | ||||
struct ip *outer_ip; | struct ip *outer_ip; | ||||
struct ip *inner_ip; | struct ip *inner_ip; | ||||
struct sctphdr *sh; | struct sctphdr *sh; | ||||
struct icmp *icmp; | struct icmp *icmp; | ||||
struct sctp_inpcb *inp; | struct sctp_inpcb *inp; | ||||
struct sctp_tcb *stcb; | struct sctp_tcb *stcb; | ||||
struct sctp_nets *net; | struct sctp_nets *net; | ||||
struct sctp_init_chunk *ch; | struct sctp_init_chunk *ch; | ||||
struct sockaddr_in src, dst; | struct sockaddr_in src, dst; | ||||
if (sa->sa_family != AF_INET || | if (sin->sin_addr.s_addr == INADDR_ANY) { | ||||
((struct sockaddr_in *)sa)->sin_addr.s_addr == INADDR_ANY) { | |||||
return; | return; | ||||
} | } | ||||
if (PRC_IS_REDIRECT(cmd)) { | if (PRC_IS_REDIRECT(cmd)) { | ||||
vip = NULL; | ip = NULL; | ||||
} else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0) { | } else if ((unsigned)cmd >= PRC_NCMDS || inetctlerrmap[cmd] == 0) { | ||||
return; | return; | ||||
} | } | ||||
if (vip != NULL) { | if (ip != NULL) { | ||||
inner_ip = (struct ip *)vip; | inner_ip = ip; | ||||
icmp = (struct icmp *)((caddr_t)inner_ip - | icmp = (struct icmp *)((caddr_t)inner_ip - | ||||
(sizeof(struct icmp) - sizeof(struct ip))); | (sizeof(struct icmp) - sizeof(struct ip))); | ||||
outer_ip = (struct ip *)((caddr_t)icmp - sizeof(struct ip)); | outer_ip = (struct ip *)((caddr_t)icmp - sizeof(struct ip)); | ||||
sh = (struct sctphdr *)((caddr_t)inner_ip + (inner_ip->ip_hl << 2)); | sh = (struct sctphdr *)((caddr_t)inner_ip + (inner_ip->ip_hl << 2)); | ||||
memset(&src, 0, sizeof(struct sockaddr_in)); | memset(&src, 0, sizeof(struct sockaddr_in)); | ||||
src.sin_family = AF_INET; | src.sin_family = AF_INET; | ||||
src.sin_len = sizeof(struct sockaddr_in); | src.sin_len = sizeof(struct sockaddr_in); | ||||
src.sin_port = sh->src_port; | src.sin_port = sh->src_port; | ||||
▲ Show 20 Lines • Show All 7,269 Lines • Show Last 20 Lines |