Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/ip_divert.c
Show First 20 Lines • Show All 279 Lines • ▼ Show 20 Lines | CK_LIST_FOREACH(inp, &V_divcb, inp_list) { | ||||
/* XXX why does only one socket match? */ | /* XXX why does only one socket match? */ | ||||
if (inp->inp_lport == nport) { | if (inp->inp_lport == nport) { | ||||
INP_RLOCK(inp); | INP_RLOCK(inp); | ||||
sa = inp->inp_socket; | sa = inp->inp_socket; | ||||
SOCKBUF_LOCK(&sa->so_rcv); | SOCKBUF_LOCK(&sa->so_rcv); | ||||
if (sbappendaddr_locked(&sa->so_rcv, | if (sbappendaddr_locked(&sa->so_rcv, | ||||
(struct sockaddr *)&divsrc, m, | (struct sockaddr *)&divsrc, m, | ||||
(struct mbuf *)0) == 0) { | (struct mbuf *)0) == 0) { | ||||
SOCKBUF_UNLOCK(&sa->so_rcv); | soroverflow_locked(sa); | ||||
sa = NULL; /* force mbuf reclaim below */ | sa = NULL; /* force mbuf reclaim below */ | ||||
} else | } else | ||||
sorwakeup_locked(sa); | sorwakeup_locked(sa); | ||||
INP_RUNLOCK(inp); | INP_RUNLOCK(inp); | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
if (sa == NULL) { | if (sa == NULL) { | ||||
▲ Show 20 Lines • Show All 544 Lines • Show Last 20 Lines |