| 130 | } |
| 131 | |
| 132 | static __noinline int |
| 133 | pfil_fake_mbuf(pfil_func_t func, pfil_packet_t *p, struct ifnet *ifp, int flags, |
| 134 | void *ruleset, struct inpcb *inp) |
| 135 | { |
| 136 | struct mbuf m, *mp; |
| 137 | pfil_return_t rv; |
| 138 | |
| 139 | (void)m_init(&m, M_NOWAIT, MT_DATA, M_NOFREE | M_PKTHDR); |
| 140 | m_extadd(&m, p->mem, PFIL_LENGTH(flags), NULL, NULL, NULL, 0, |
| 141 | EXT_RXRING); |
| 142 | m.m_len = m.m_pkthdr.len = PFIL_LENGTH(flags); |
| 143 | mp = &m; |
| 144 | flags &= ~(PFIL_MEMPTR | PFIL_LENMASK); |
| 145 | |
| 146 | rv = func(&mp, ifp, flags, ruleset, inp); |
| 147 | if (rv == PFIL_PASS && mp != &m) { |
| 148 | /* |
| 149 | * Firewalls that need pfil_fake_mbuf() most likely don't |
| 150 | * know they need return PFIL_REALLOCED. |
| 151 | */ |
| 152 | rv = PFIL_REALLOCED; |
| 153 | *p = pfil_packet_align(*p); |
| 154 | *p->m = mp; |
| 155 | } |
| 156 | |
| 157 | return (rv); |
| 158 | } |
| 159 | |
| 160 | /* |
| 161 | * pfil_run_hooks() runs the specified packet filter hook chain. |
no test coverage detected