args.m = m;
args.next_hop = dst;
args.oif = ifp;
+ lck_mtx_unlock(ip_mutex);
off = ip_fw_chk_ptr(&args);
m = args.m;
dst = args.next_hop;
if (m)
m_freem(m);
error = EACCES ;
- lck_mtx_unlock(ip_mutex);
goto done ;
}
ip = mtod(m, struct ip *);
- if (off == 0 && dst == old) /* common case */
+ if (off == 0 && dst == old) {/* common case */
+ lck_mtx_lock(ip_mutex);
goto pass ;
+ }
#if DUMMYNET
if (DUMMYNET_LOADED && (off & IP_FW_PORT_DYNT_FLAG) != 0) {
/*
args.dst = dst;
args.flags = flags;
- lck_mtx_unlock(ip_mutex);
error = ip_dn_io_ptr(m, off & 0xffff, DN_TO_IP_OUT,
&args);
goto done;
}
#endif /* DUMMYNET */
+ lck_mtx_lock(ip_mutex);
#if IPDIVERT
if (off != 0 && (off & IP_FW_PORT_DYNT_FLAG) == 0) {
struct mbuf *clone = NULL;
}
if (ip_offset + sizeof(struct ip) > m->m_len) {
- printf("delayed m_pullup, m->len: %d off: %d p: %d\n",
- m->m_len, ip_offset, ip->ip_p);
+ printf("delayed m_pullup, m->len: %d off: %d\n",
+ m->m_len, ip_offset);
/*
* XXX
* this shouldn't happen