| 210 | } |
| 211 | |
| 212 | int |
| 213 | udp_ipsec_output(struct mbuf *m, struct secasvar *sav) |
| 214 | { |
| 215 | struct udphdr *udp; |
| 216 | struct mbuf *n; |
| 217 | struct ip *ip; |
| 218 | int hlen, off; |
| 219 | |
| 220 | IPSEC_ASSERT(sav->natt != NULL, ("UDP encapsulation isn't required.")); |
| 221 | |
| 222 | if (sav->sah->saidx.dst.sa.sa_family == AF_INET6) |
| 223 | return (EAFNOSUPPORT); |
| 224 | |
| 225 | ip = mtod(m, struct ip *); |
| 226 | hlen = ip->ip_hl << 2; |
| 227 | n = m_makespace(m, hlen, sizeof(*udp), &off); |
| 228 | if (n == NULL) { |
| 229 | DPRINTF(("%s: m_makespace for udphdr failed\n", __func__)); |
| 230 | return (ENOBUFS); |
| 231 | } |
| 232 | |
| 233 | udp = mtodo(n, off); |
| 234 | udp->uh_dport = sav->natt->dport; |
| 235 | udp->uh_sport = sav->natt->sport; |
| 236 | udp->uh_sum = 0; |
| 237 | udp->uh_ulen = htons(m->m_pkthdr.len - hlen); |
| 238 | |
| 239 | ip = mtod(m, struct ip *); |
| 240 | ip->ip_len = htons(m->m_pkthdr.len); |
| 241 | ip->ip_p = IPPROTO_UDP; |
| 242 | return (0); |
| 243 | } |
| 244 | |
| 245 | void |
| 246 | udp_ipsec_adjust_cksum(struct mbuf *m, struct secasvar *sav, int proto, |
no test coverage detected