]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/netinet/ip_output.c
Import libc++ trunk r165949. Among other improvements and bug fixes,
[FreeBSD/FreeBSD.git] / sys / netinet / ip_output.c
1 /*-
2  * Copyright (c) 1982, 1986, 1988, 1990, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 4. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  *      @(#)ip_output.c 8.3 (Berkeley) 1/21/94
30  */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #include "opt_ipfw.h"
36 #include "opt_ipsec.h"
37 #include "opt_route.h"
38 #include "opt_mbuf_stress_test.h"
39 #include "opt_mpath.h"
40 #include "opt_sctp.h"
41
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
45 #include <sys/malloc.h>
46 #include <sys/mbuf.h>
47 #include <sys/priv.h>
48 #include <sys/proc.h>
49 #include <sys/protosw.h>
50 #include <sys/socket.h>
51 #include <sys/socketvar.h>
52 #include <sys/sysctl.h>
53 #include <sys/ucred.h>
54
55 #include <net/if.h>
56 #include <net/if_llatbl.h>
57 #include <net/netisr.h>
58 #include <net/pfil.h>
59 #include <net/route.h>
60 #include <net/flowtable.h>
61 #ifdef RADIX_MPATH
62 #include <net/radix_mpath.h>
63 #endif
64 #include <net/vnet.h>
65
66 #include <netinet/in.h>
67 #include <netinet/in_systm.h>
68 #include <netinet/ip.h>
69 #include <netinet/in_pcb.h>
70 #include <netinet/in_var.h>
71 #include <netinet/ip_var.h>
72 #include <netinet/ip_options.h>
73 #ifdef SCTP
74 #include <netinet/sctp.h>
75 #include <netinet/sctp_crc32.h>
76 #endif
77
78 #ifdef IPSEC
79 #include <netinet/ip_ipsec.h>
80 #include <netipsec/ipsec.h>
81 #endif /* IPSEC*/
82
83 #include <machine/in_cksum.h>
84
85 #include <security/mac/mac_framework.h>
86
87 VNET_DEFINE(u_short, ip_id);
88
89 #ifdef MBUF_STRESS_TEST
90 static int mbuf_frag_size = 0;
91 SYSCTL_INT(_net_inet_ip, OID_AUTO, mbuf_frag_size, CTLFLAG_RW,
92         &mbuf_frag_size, 0, "Fragment outgoing mbufs to this size");
93 #endif
94
95 static void     ip_mloopback
96         (struct ifnet *, struct mbuf *, struct sockaddr_in *, int);
97
98
99 extern int in_mcast_loop;
100 extern  struct protosw inetsw[];
101
102 /*
103  * IP output.  The packet in mbuf chain m contains a skeletal IP
104  * header (with len, off, ttl, proto, tos, src, dst).
105  * ip_len and ip_off are in host format.
106  * The mbuf chain containing the packet will be freed.
107  * The mbuf opt, if present, will not be freed.
108  * If route ro is present and has ro_rt initialized, route lookup would be
109  * skipped and ro->ro_rt would be used. If ro is present but ro->ro_rt is NULL,
110  * then result of route lookup is stored in ro->ro_rt.
111  *
112  * In the IP forwarding case, the packet will arrive with options already
113  * inserted, so must have a NULL opt pointer.
114  */
115 int
116 ip_output(struct mbuf *m, struct mbuf *opt, struct route *ro, int flags,
117     struct ip_moptions *imo, struct inpcb *inp)
118 {
119         struct ip *ip;
120         struct ifnet *ifp = NULL;       /* keep compiler happy */
121         struct mbuf *m0;
122         int hlen = sizeof (struct ip);
123         int mtu;
124         int n;  /* scratchpad */
125         int error = 0;
126         struct sockaddr_in *dst;
127         struct in_ifaddr *ia;
128         int isbroadcast;
129         uint16_t ip_len, ip_off, sw_csum;
130         struct route iproute;
131         struct rtentry *rte;    /* cache for ro->ro_rt */
132         struct in_addr odst;
133 #ifdef IPFIREWALL_FORWARD
134         struct m_tag *fwd_tag = NULL;
135 #endif
136 #ifdef IPSEC
137         int no_route_but_check_spd = 0;
138 #endif
139         M_ASSERTPKTHDR(m);
140
141         if (inp != NULL) {
142                 INP_LOCK_ASSERT(inp);
143                 M_SETFIB(m, inp->inp_inc.inc_fibnum);
144                 if (inp->inp_flags & (INP_HW_FLOWID|INP_SW_FLOWID)) {
145                         m->m_pkthdr.flowid = inp->inp_flowid;
146                         m->m_flags |= M_FLOWID;
147                 }
148         }
149
150         if (ro == NULL) {
151                 ro = &iproute;
152                 bzero(ro, sizeof (*ro));
153         }
154
155 #ifdef FLOWTABLE
156         if (ro->ro_rt == NULL) {
157                 struct flentry *fle;
158                         
159                 /*
160                  * The flow table returns route entries valid for up to 30
161                  * seconds; we rely on the remainder of ip_output() taking no
162                  * longer than that long for the stability of ro_rt. The
163                  * flow ID assignment must have happened before this point.
164                  */
165                 fle = flowtable_lookup_mbuf(V_ip_ft, m, AF_INET);
166                 if (fle != NULL)
167                         flow_to_route(fle, ro);
168         }
169 #endif
170
171         if (opt) {
172                 int len = 0;
173                 m = ip_insertoptions(m, opt, &len);
174                 if (len != 0)
175                         hlen = len; /* ip->ip_hl is updated above */
176         }
177         ip = mtod(m, struct ip *);
178
179         /*
180          * Fill in IP header.  If we are not allowing fragmentation,
181          * then the ip_id field is meaningless, but we don't set it
182          * to zero.  Doing so causes various problems when devices along
183          * the path (routers, load balancers, firewalls, etc.) illegally
184          * disable DF on our packet.  Note that a 16-bit counter
185          * will wrap around in less than 10 seconds at 100 Mbit/s on a
186          * medium with MTU 1500.  See Steven M. Bellovin, "A Technique
187          * for Counting NATted Hosts", Proc. IMW'02, available at
188          * <http://www.cs.columbia.edu/~smb/papers/fnat.pdf>.
189          */
190         if ((flags & (IP_FORWARDING|IP_RAWOUTPUT)) == 0) {
191                 ip->ip_v = IPVERSION;
192                 ip->ip_hl = hlen >> 2;
193                 ip->ip_id = ip_newid();
194                 IPSTAT_INC(ips_localout);
195         } else {
196                 /* Header already set, fetch hlen from there */
197                 hlen = ip->ip_hl << 2;
198         }
199
200         dst = (struct sockaddr_in *)&ro->ro_dst;
201 again:
202         ia = NULL;
203         /*
204          * If there is a cached route,
205          * check that it is to the same destination
206          * and is still up.  If not, free it and try again.
207          * The address family should also be checked in case of sharing the
208          * cache with IPv6.
209          */
210         rte = ro->ro_rt;
211         if (rte && ((rte->rt_flags & RTF_UP) == 0 ||
212                     rte->rt_ifp == NULL ||
213                     !RT_LINK_IS_UP(rte->rt_ifp) ||
214                           dst->sin_family != AF_INET ||
215                           dst->sin_addr.s_addr != ip->ip_dst.s_addr)) {
216                 RO_RTFREE(ro);
217                 ro->ro_lle = NULL;
218                 rte = NULL;
219         }
220 #ifdef IPFIREWALL_FORWARD
221         if (rte == NULL && fwd_tag == NULL) {
222 #else
223         if (rte == NULL) {
224 #endif
225                 bzero(dst, sizeof(*dst));
226                 dst->sin_family = AF_INET;
227                 dst->sin_len = sizeof(*dst);
228                 dst->sin_addr = ip->ip_dst;
229         }
230         /*
231          * If routing to interface only, short circuit routing lookup.
232          * The use of an all-ones broadcast address implies this; an
233          * interface is specified by the broadcast address of an interface,
234          * or the destination address of a ptp interface.
235          */
236         if (flags & IP_SENDONES) {
237                 if ((ia = ifatoia(ifa_ifwithbroadaddr(sintosa(dst)))) == NULL &&
238                     (ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst)))) == NULL) {
239                         IPSTAT_INC(ips_noroute);
240                         error = ENETUNREACH;
241                         goto bad;
242                 }
243                 ip->ip_dst.s_addr = INADDR_BROADCAST;
244                 dst->sin_addr = ip->ip_dst;
245                 ifp = ia->ia_ifp;
246                 ip->ip_ttl = 1;
247                 isbroadcast = 1;
248         } else if (flags & IP_ROUTETOIF) {
249                 if ((ia = ifatoia(ifa_ifwithdstaddr(sintosa(dst)))) == NULL &&
250                     (ia = ifatoia(ifa_ifwithnet(sintosa(dst), 0))) == NULL) {
251                         IPSTAT_INC(ips_noroute);
252                         error = ENETUNREACH;
253                         goto bad;
254                 }
255                 ifp = ia->ia_ifp;
256                 ip->ip_ttl = 1;
257                 isbroadcast = in_broadcast(dst->sin_addr, ifp);
258         } else if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr)) &&
259             imo != NULL && imo->imo_multicast_ifp != NULL) {
260                 /*
261                  * Bypass the normal routing lookup for multicast
262                  * packets if the interface is specified.
263                  */
264                 ifp = imo->imo_multicast_ifp;
265                 IFP_TO_IA(ifp, ia);
266                 isbroadcast = 0;        /* fool gcc */
267         } else {
268                 /*
269                  * We want to do any cloning requested by the link layer,
270                  * as this is probably required in all cases for correct
271                  * operation (as it is for ARP).
272                  */
273                 if (rte == NULL) {
274 #ifdef RADIX_MPATH
275                         rtalloc_mpath_fib(ro,
276                             ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr),
277                             inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m));
278 #else
279                         in_rtalloc_ign(ro, 0,
280                             inp ? inp->inp_inc.inc_fibnum : M_GETFIB(m));
281 #endif
282                         rte = ro->ro_rt;
283                 }
284                 if (rte == NULL ||
285                     rte->rt_ifp == NULL ||
286                     !RT_LINK_IS_UP(rte->rt_ifp)) {
287 #ifdef IPSEC
288                         /*
289                          * There is no route for this packet, but it is
290                          * possible that a matching SPD entry exists.
291                          */
292                         no_route_but_check_spd = 1;
293                         mtu = 0; /* Silence GCC warning. */
294                         goto sendit;
295 #endif
296                         IPSTAT_INC(ips_noroute);
297                         error = EHOSTUNREACH;
298                         goto bad;
299                 }
300                 ia = ifatoia(rte->rt_ifa);
301                 ifa_ref(&ia->ia_ifa);
302                 ifp = rte->rt_ifp;
303                 rte->rt_rmx.rmx_pksent++;
304                 if (rte->rt_flags & RTF_GATEWAY)
305                         dst = (struct sockaddr_in *)rte->rt_gateway;
306                 if (rte->rt_flags & RTF_HOST)
307                         isbroadcast = (rte->rt_flags & RTF_BROADCAST);
308                 else
309                         isbroadcast = in_broadcast(dst->sin_addr, ifp);
310         }
311         /*
312          * Calculate MTU.  If we have a route that is up, use that,
313          * otherwise use the interface's MTU.
314          */
315         if (rte != NULL && (rte->rt_flags & (RTF_UP|RTF_HOST))) {
316                 /*
317                  * This case can happen if the user changed the MTU
318                  * of an interface after enabling IP on it.  Because
319                  * most netifs don't keep track of routes pointing to
320                  * them, there is no way for one to update all its
321                  * routes when the MTU is changed.
322                  */
323                 if (rte->rt_rmx.rmx_mtu > ifp->if_mtu)
324                         rte->rt_rmx.rmx_mtu = ifp->if_mtu;
325                 mtu = rte->rt_rmx.rmx_mtu;
326         } else {
327                 mtu = ifp->if_mtu;
328         }
329         /* Catch a possible divide by zero later. */
330         KASSERT(mtu > 0, ("%s: mtu %d <= 0, rte=%p (rt_flags=0x%08x) ifp=%p",
331             __func__, mtu, rte, (rte != NULL) ? rte->rt_flags : 0, ifp));
332         if (IN_MULTICAST(ntohl(ip->ip_dst.s_addr))) {
333                 m->m_flags |= M_MCAST;
334                 /*
335                  * IP destination address is multicast.  Make sure "dst"
336                  * still points to the address in "ro".  (It may have been
337                  * changed to point to a gateway address, above.)
338                  */
339                 dst = (struct sockaddr_in *)&ro->ro_dst;
340                 /*
341                  * See if the caller provided any multicast options
342                  */
343                 if (imo != NULL) {
344                         ip->ip_ttl = imo->imo_multicast_ttl;
345                         if (imo->imo_multicast_vif != -1)
346                                 ip->ip_src.s_addr =
347                                     ip_mcast_src ?
348                                     ip_mcast_src(imo->imo_multicast_vif) :
349                                     INADDR_ANY;
350                 } else
351                         ip->ip_ttl = IP_DEFAULT_MULTICAST_TTL;
352                 /*
353                  * Confirm that the outgoing interface supports multicast.
354                  */
355                 if ((imo == NULL) || (imo->imo_multicast_vif == -1)) {
356                         if ((ifp->if_flags & IFF_MULTICAST) == 0) {
357                                 IPSTAT_INC(ips_noroute);
358                                 error = ENETUNREACH;
359                                 goto bad;
360                         }
361                 }
362                 /*
363                  * If source address not specified yet, use address
364                  * of outgoing interface.
365                  */
366                 if (ip->ip_src.s_addr == INADDR_ANY) {
367                         /* Interface may have no addresses. */
368                         if (ia != NULL)
369                                 ip->ip_src = IA_SIN(ia)->sin_addr;
370                 }
371
372                 if ((imo == NULL && in_mcast_loop) ||
373                     (imo && imo->imo_multicast_loop)) {
374                         /*
375                          * Loop back multicast datagram if not expressly
376                          * forbidden to do so, even if we are not a member
377                          * of the group; ip_input() will filter it later,
378                          * thus deferring a hash lookup and mutex acquisition
379                          * at the expense of a cheap copy using m_copym().
380                          */
381                         ip_mloopback(ifp, m, dst, hlen);
382                 } else {
383                         /*
384                          * If we are acting as a multicast router, perform
385                          * multicast forwarding as if the packet had just
386                          * arrived on the interface to which we are about
387                          * to send.  The multicast forwarding function
388                          * recursively calls this function, using the
389                          * IP_FORWARDING flag to prevent infinite recursion.
390                          *
391                          * Multicasts that are looped back by ip_mloopback(),
392                          * above, will be forwarded by the ip_input() routine,
393                          * if necessary.
394                          */
395                         if (V_ip_mrouter && (flags & IP_FORWARDING) == 0) {
396                                 /*
397                                  * If rsvp daemon is not running, do not
398                                  * set ip_moptions. This ensures that the packet
399                                  * is multicast and not just sent down one link
400                                  * as prescribed by rsvpd.
401                                  */
402                                 if (!V_rsvp_on)
403                                         imo = NULL;
404                                 if (ip_mforward &&
405                                     ip_mforward(ip, ifp, m, imo) != 0) {
406                                         m_freem(m);
407                                         goto done;
408                                 }
409                         }
410                 }
411
412                 /*
413                  * Multicasts with a time-to-live of zero may be looped-
414                  * back, above, but must not be transmitted on a network.
415                  * Also, multicasts addressed to the loopback interface
416                  * are not sent -- the above call to ip_mloopback() will
417                  * loop back a copy. ip_input() will drop the copy if
418                  * this host does not belong to the destination group on
419                  * the loopback interface.
420                  */
421                 if (ip->ip_ttl == 0 || ifp->if_flags & IFF_LOOPBACK) {
422                         m_freem(m);
423                         goto done;
424                 }
425
426                 goto sendit;
427         }
428
429         /*
430          * If the source address is not specified yet, use the address
431          * of the outoing interface.
432          */
433         if (ip->ip_src.s_addr == INADDR_ANY) {
434                 /* Interface may have no addresses. */
435                 if (ia != NULL) {
436                         ip->ip_src = IA_SIN(ia)->sin_addr;
437                 }
438         }
439
440         /*
441          * Verify that we have any chance at all of being able to queue the
442          * packet or packet fragments, unless ALTQ is enabled on the given
443          * interface in which case packetdrop should be done by queueing.
444          */
445         n = ip->ip_len / mtu + 1; /* how many fragments ? */
446         if (
447 #ifdef ALTQ
448             (!ALTQ_IS_ENABLED(&ifp->if_snd)) &&
449 #endif /* ALTQ */
450             (ifp->if_snd.ifq_len + n) >= ifp->if_snd.ifq_maxlen ) {
451                 error = ENOBUFS;
452                 IPSTAT_INC(ips_odropped);
453                 ifp->if_snd.ifq_drops += n;
454                 goto bad;
455         }
456
457         /*
458          * Look for broadcast address and
459          * verify user is allowed to send
460          * such a packet.
461          */
462         if (isbroadcast) {
463                 if ((ifp->if_flags & IFF_BROADCAST) == 0) {
464                         error = EADDRNOTAVAIL;
465                         goto bad;
466                 }
467                 if ((flags & IP_ALLOWBROADCAST) == 0) {
468                         error = EACCES;
469                         goto bad;
470                 }
471                 /* don't allow broadcast messages to be fragmented */
472                 if (ip->ip_len > mtu) {
473                         error = EMSGSIZE;
474                         goto bad;
475                 }
476                 m->m_flags |= M_BCAST;
477         } else {
478                 m->m_flags &= ~M_BCAST;
479         }
480
481 sendit:
482 #ifdef IPSEC
483         switch(ip_ipsec_output(&m, inp, &flags, &error)) {
484         case 1:
485                 goto bad;
486         case -1:
487                 goto done;
488         case 0:
489         default:
490                 break;  /* Continue with packet processing. */
491         }
492         /*
493          * Check if there was a route for this packet; return error if not.
494          */
495         if (no_route_but_check_spd) {
496                 IPSTAT_INC(ips_noroute);
497                 error = EHOSTUNREACH;
498                 goto bad;
499         }
500         /* Update variables that are affected by ipsec4_output(). */
501         ip = mtod(m, struct ip *);
502         hlen = ip->ip_hl << 2;
503 #endif /* IPSEC */
504
505         /*
506          * To network byte order. pfil(9) hooks and ip_fragment() expect this.
507          */
508         ip->ip_len = htons(ip->ip_len);
509         ip->ip_off = htons(ip->ip_off);
510
511         /* Jump over all PFIL processing if hooks are not active. */
512         if (!PFIL_HOOKED(&V_inet_pfil_hook))
513                 goto passout;
514
515         /* Run through list of hooks for output packets. */
516         odst.s_addr = ip->ip_dst.s_addr;
517         error = pfil_run_hooks(&V_inet_pfil_hook, &m, ifp, PFIL_OUT, inp);
518         if (error != 0 || m == NULL)
519                 goto done;
520
521         ip = mtod(m, struct ip *);
522
523         /* See if destination IP address was changed by packet filter. */
524         if (odst.s_addr != ip->ip_dst.s_addr) {
525                 m->m_flags |= M_SKIP_FIREWALL;
526                 /* If destination is now ourself drop to ip_input(). */
527                 if (in_localip(ip->ip_dst)) {
528                         m->m_flags |= M_FASTFWD_OURS;
529                         if (m->m_pkthdr.rcvif == NULL)
530                                 m->m_pkthdr.rcvif = V_loif;
531                         if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
532                                 m->m_pkthdr.csum_flags |=
533                                     CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
534                                 m->m_pkthdr.csum_data = 0xffff;
535                         }
536                         m->m_pkthdr.csum_flags |=
537                             CSUM_IP_CHECKED | CSUM_IP_VALID;
538 #ifdef SCTP
539                         if (m->m_pkthdr.csum_flags & CSUM_SCTP)
540                                 m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
541 #endif
542                         error = netisr_queue(NETISR_IP, m);
543                         goto done;
544                 } else {
545                         if (ia != NULL)
546                                 ifa_free(&ia->ia_ifa);
547                         ip->ip_len = ntohs(ip->ip_len);
548                         ip->ip_off = ntohs(ip->ip_off);
549                         goto again;     /* Redo the routing table lookup. */
550                 }
551         }
552
553 #ifdef IPFIREWALL_FORWARD
554         /* See if local, if yes, send it to netisr with IP_FASTFWD_OURS. */
555         if (m->m_flags & M_FASTFWD_OURS) {
556                 if (m->m_pkthdr.rcvif == NULL)
557                         m->m_pkthdr.rcvif = V_loif;
558                 if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
559                         m->m_pkthdr.csum_flags |=
560                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
561                         m->m_pkthdr.csum_data = 0xffff;
562                 }
563 #ifdef SCTP
564                 if (m->m_pkthdr.csum_flags & CSUM_SCTP)
565                         m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
566 #endif
567                 m->m_pkthdr.csum_flags |=
568                             CSUM_IP_CHECKED | CSUM_IP_VALID;
569
570                 error = netisr_queue(NETISR_IP, m);
571                 goto done;
572         }
573         /* Or forward to some other address? */
574         fwd_tag = m_tag_find(m, PACKET_TAG_IPFORWARD, NULL);
575         if (fwd_tag) {
576                 dst = (struct sockaddr_in *)&ro->ro_dst;
577                 bcopy((fwd_tag+1), dst, sizeof(struct sockaddr_in));
578                 m->m_flags |= M_SKIP_FIREWALL;
579                 m_tag_delete(m, fwd_tag);
580                 if (ia != NULL)
581                         ifa_free(&ia->ia_ifa);
582                 ip->ip_len = ntohs(ip->ip_len);
583                 ip->ip_off = ntohs(ip->ip_off);
584                 goto again;
585         }
586 #endif /* IPFIREWALL_FORWARD */
587
588 passout:
589         ip_len = ntohs(ip->ip_len);
590         ip_off = ntohs(ip->ip_off);
591
592         /* 127/8 must not appear on wire - RFC1122. */
593         if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET ||
594             (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) {
595                 if ((ifp->if_flags & IFF_LOOPBACK) == 0) {
596                         IPSTAT_INC(ips_badaddr);
597                         error = EADDRNOTAVAIL;
598                         goto bad;
599                 }
600         }
601
602         m->m_pkthdr.csum_flags |= CSUM_IP;
603         sw_csum = m->m_pkthdr.csum_flags & ~ifp->if_hwassist;
604         if (sw_csum & CSUM_DELAY_DATA) {
605                 in_delayed_cksum(m);
606                 sw_csum &= ~CSUM_DELAY_DATA;
607         }
608 #ifdef SCTP
609         if (sw_csum & CSUM_SCTP) {
610                 sctp_delayed_cksum(m, (uint32_t)(ip->ip_hl << 2));
611                 sw_csum &= ~CSUM_SCTP;
612         }
613 #endif
614         m->m_pkthdr.csum_flags &= ifp->if_hwassist;
615
616         /*
617          * If small enough for interface, or the interface will take
618          * care of the fragmentation for us, we can just send directly.
619          */
620         if (ip_len <= mtu ||
621             (m->m_pkthdr.csum_flags & ifp->if_hwassist & CSUM_TSO) != 0 ||
622             ((ip_off & IP_DF) == 0 && (ifp->if_hwassist & CSUM_FRAGMENT))) {
623                 ip->ip_sum = 0;
624                 if (sw_csum & CSUM_DELAY_IP)
625                         ip->ip_sum = in_cksum(m, hlen);
626
627                 /*
628                  * Record statistics for this interface address.
629                  * With CSUM_TSO the byte/packet count will be slightly
630                  * incorrect because we count the IP+TCP headers only
631                  * once instead of for every generated packet.
632                  */
633                 if (!(flags & IP_FORWARDING) && ia) {
634                         if (m->m_pkthdr.csum_flags & CSUM_TSO)
635                                 ia->ia_ifa.if_opackets +=
636                                     m->m_pkthdr.len / m->m_pkthdr.tso_segsz;
637                         else
638                                 ia->ia_ifa.if_opackets++;
639                         ia->ia_ifa.if_obytes += m->m_pkthdr.len;
640                 }
641 #ifdef MBUF_STRESS_TEST
642                 if (mbuf_frag_size && m->m_pkthdr.len > mbuf_frag_size)
643                         m = m_fragment(m, M_DONTWAIT, mbuf_frag_size);
644 #endif
645                 /*
646                  * Reset layer specific mbuf flags
647                  * to avoid confusing lower layers.
648                  */
649                 m->m_flags &= ~(M_PROTOFLAGS);
650                 error = (*ifp->if_output)(ifp, m,
651                                 (struct sockaddr *)dst, ro);
652                 goto done;
653         }
654
655         /* Balk when DF bit is set or the interface didn't support TSO. */
656         if ((ip_off & IP_DF) || (m->m_pkthdr.csum_flags & CSUM_TSO)) {
657                 error = EMSGSIZE;
658                 IPSTAT_INC(ips_cantfrag);
659                 goto bad;
660         }
661
662         /*
663          * Too large for interface; fragment if possible. If successful,
664          * on return, m will point to a list of packets to be sent.
665          */
666         error = ip_fragment(ip, &m, mtu, ifp->if_hwassist, sw_csum);
667         if (error)
668                 goto bad;
669         for (; m; m = m0) {
670                 m0 = m->m_nextpkt;
671                 m->m_nextpkt = 0;
672                 if (error == 0) {
673                         /* Record statistics for this interface address. */
674                         if (ia != NULL) {
675                                 ia->ia_ifa.if_opackets++;
676                                 ia->ia_ifa.if_obytes += m->m_pkthdr.len;
677                         }
678                         /*
679                          * Reset layer specific mbuf flags
680                          * to avoid confusing upper layers.
681                          */
682                         m->m_flags &= ~(M_PROTOFLAGS);
683
684                         error = (*ifp->if_output)(ifp, m,
685                             (struct sockaddr *)dst, ro);
686                 } else
687                         m_freem(m);
688         }
689
690         if (error == 0)
691                 IPSTAT_INC(ips_fragmented);
692
693 done:
694         if (ro == &iproute)
695                 RO_RTFREE(ro);
696         if (ia != NULL)
697                 ifa_free(&ia->ia_ifa);
698         return (error);
699 bad:
700         m_freem(m);
701         goto done;
702 }
703
704 /*
705  * Create a chain of fragments which fit the given mtu. m_frag points to the
706  * mbuf to be fragmented; on return it points to the chain with the fragments.
707  * Return 0 if no error. If error, m_frag may contain a partially built
708  * chain of fragments that should be freed by the caller.
709  *
710  * if_hwassist_flags is the hw offload capabilities (see if_data.ifi_hwassist)
711  * sw_csum contains the delayed checksums flags (e.g., CSUM_DELAY_IP).
712  */
713 int
714 ip_fragment(struct ip *ip, struct mbuf **m_frag, int mtu,
715     u_long if_hwassist_flags, int sw_csum)
716 {
717         int error = 0;
718         int hlen = ip->ip_hl << 2;
719         int len = (mtu - hlen) & ~7;    /* size of payload in each fragment */
720         int off;
721         struct mbuf *m0 = *m_frag;      /* the original packet          */
722         int firstlen;
723         struct mbuf **mnext;
724         int nfrags;
725         uint16_t ip_len, ip_off;
726
727         ip_len = ntohs(ip->ip_len);
728         ip_off = ntohs(ip->ip_off);
729
730         if (ip_off & IP_DF) {   /* Fragmentation not allowed */
731                 IPSTAT_INC(ips_cantfrag);
732                 return EMSGSIZE;
733         }
734
735         /*
736          * Must be able to put at least 8 bytes per fragment.
737          */
738         if (len < 8)
739                 return EMSGSIZE;
740
741         /*
742          * If the interface will not calculate checksums on
743          * fragmented packets, then do it here.
744          */
745         if (m0->m_pkthdr.csum_flags & CSUM_DELAY_DATA &&
746             (if_hwassist_flags & CSUM_IP_FRAGS) == 0) {
747                 in_delayed_cksum(m0);
748                 m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
749         }
750 #ifdef SCTP
751         if (m0->m_pkthdr.csum_flags & CSUM_SCTP &&
752             (if_hwassist_flags & CSUM_IP_FRAGS) == 0) {
753                 sctp_delayed_cksum(m0, hlen);
754                 m0->m_pkthdr.csum_flags &= ~CSUM_SCTP;
755         }
756 #endif
757         if (len > PAGE_SIZE) {
758                 /* 
759                  * Fragment large datagrams such that each segment 
760                  * contains a multiple of PAGE_SIZE amount of data, 
761                  * plus headers. This enables a receiver to perform 
762                  * page-flipping zero-copy optimizations.
763                  *
764                  * XXX When does this help given that sender and receiver
765                  * could have different page sizes, and also mtu could
766                  * be less than the receiver's page size ?
767                  */
768                 int newlen;
769                 struct mbuf *m;
770
771                 for (m = m0, off = 0; m && (off+m->m_len) <= mtu; m = m->m_next)
772                         off += m->m_len;
773
774                 /*
775                  * firstlen (off - hlen) must be aligned on an 
776                  * 8-byte boundary
777                  */
778                 if (off < hlen)
779                         goto smart_frag_failure;
780                 off = ((off - hlen) & ~7) + hlen;
781                 newlen = (~PAGE_MASK) & mtu;
782                 if ((newlen + sizeof (struct ip)) > mtu) {
783                         /* we failed, go back the default */
784 smart_frag_failure:
785                         newlen = len;
786                         off = hlen + len;
787                 }
788                 len = newlen;
789
790         } else {
791                 off = hlen + len;
792         }
793
794         firstlen = off - hlen;
795         mnext = &m0->m_nextpkt;         /* pointer to next packet */
796
797         /*
798          * Loop through length of segment after first fragment,
799          * make new header and copy data of each part and link onto chain.
800          * Here, m0 is the original packet, m is the fragment being created.
801          * The fragments are linked off the m_nextpkt of the original
802          * packet, which after processing serves as the first fragment.
803          */
804         for (nfrags = 1; off < ip_len; off += len, nfrags++) {
805                 struct ip *mhip;        /* ip header on the fragment */
806                 struct mbuf *m;
807                 int mhlen = sizeof (struct ip);
808
809                 MGETHDR(m, M_DONTWAIT, MT_DATA);
810                 if (m == NULL) {
811                         error = ENOBUFS;
812                         IPSTAT_INC(ips_odropped);
813                         goto done;
814                 }
815                 m->m_flags |= (m0->m_flags & M_MCAST) | M_FRAG;
816                 /*
817                  * In the first mbuf, leave room for the link header, then
818                  * copy the original IP header including options. The payload
819                  * goes into an additional mbuf chain returned by m_copym().
820                  */
821                 m->m_data += max_linkhdr;
822                 mhip = mtod(m, struct ip *);
823                 *mhip = *ip;
824                 if (hlen > sizeof (struct ip)) {
825                         mhlen = ip_optcopy(ip, mhip) + sizeof (struct ip);
826                         mhip->ip_v = IPVERSION;
827                         mhip->ip_hl = mhlen >> 2;
828                 }
829                 m->m_len = mhlen;
830                 /* XXX do we need to add ip_off below ? */
831                 mhip->ip_off = ((off - hlen) >> 3) + ip_off;
832                 if (off + len >= ip_len) {      /* last fragment */
833                         len = ip_len - off;
834                         m->m_flags |= M_LASTFRAG;
835                 } else
836                         mhip->ip_off |= IP_MF;
837                 mhip->ip_len = htons((u_short)(len + mhlen));
838                 m->m_next = m_copym(m0, off, len, M_DONTWAIT);
839                 if (m->m_next == NULL) {        /* copy failed */
840                         m_free(m);
841                         error = ENOBUFS;        /* ??? */
842                         IPSTAT_INC(ips_odropped);
843                         goto done;
844                 }
845                 m->m_pkthdr.len = mhlen + len;
846                 m->m_pkthdr.rcvif = NULL;
847 #ifdef MAC
848                 mac_netinet_fragment(m0, m);
849 #endif
850                 m->m_pkthdr.csum_flags = m0->m_pkthdr.csum_flags;
851                 mhip->ip_off = htons(mhip->ip_off);
852                 mhip->ip_sum = 0;
853                 if (sw_csum & CSUM_DELAY_IP)
854                         mhip->ip_sum = in_cksum(m, mhlen);
855                 *mnext = m;
856                 mnext = &m->m_nextpkt;
857         }
858         IPSTAT_ADD(ips_ofragments, nfrags);
859
860         /* set first marker for fragment chain */
861         m0->m_flags |= M_FIRSTFRAG | M_FRAG;
862         m0->m_pkthdr.csum_data = nfrags;
863
864         /*
865          * Update first fragment by trimming what's been copied out
866          * and updating header.
867          */
868         m_adj(m0, hlen + firstlen - ip_len);
869         m0->m_pkthdr.len = hlen + firstlen;
870         ip->ip_len = htons((u_short)m0->m_pkthdr.len);
871         ip->ip_off = htons(ip_off | IP_MF);
872         ip->ip_sum = 0;
873         if (sw_csum & CSUM_DELAY_IP)
874                 ip->ip_sum = in_cksum(m0, hlen);
875
876 done:
877         *m_frag = m0;
878         return error;
879 }
880
881 void
882 in_delayed_cksum(struct mbuf *m)
883 {
884         struct ip *ip;
885         uint16_t csum, offset, ip_len;
886
887         ip = mtod(m, struct ip *);
888         offset = ip->ip_hl << 2 ;
889         ip_len = ntohs(ip->ip_len);
890         csum = in_cksum_skip(m, ip_len, offset);
891         if (m->m_pkthdr.csum_flags & CSUM_UDP && csum == 0)
892                 csum = 0xffff;
893         offset += m->m_pkthdr.csum_data;        /* checksum offset */
894
895         if (offset + sizeof(u_short) > m->m_len) {
896                 printf("delayed m_pullup, m->len: %d  off: %d  p: %d\n",
897                     m->m_len, offset, ip->ip_p);
898                 /*
899                  * XXX
900                  * this shouldn't happen, but if it does, the
901                  * correct behavior may be to insert the checksum
902                  * in the appropriate next mbuf in the chain.
903                  */
904                 return;
905         }
906         *(u_short *)(m->m_data + offset) = csum;
907 }
908
909 /*
910  * IP socket option processing.
911  */
912 int
913 ip_ctloutput(struct socket *so, struct sockopt *sopt)
914 {
915         struct  inpcb *inp = sotoinpcb(so);
916         int     error, optval;
917
918         error = optval = 0;
919         if (sopt->sopt_level != IPPROTO_IP) {
920                 error = EINVAL;
921
922                 if (sopt->sopt_level == SOL_SOCKET &&
923                     sopt->sopt_dir == SOPT_SET) {
924                         switch (sopt->sopt_name) {
925                         case SO_REUSEADDR:
926                                 INP_WLOCK(inp);
927                                 if (IN_MULTICAST(ntohl(inp->inp_laddr.s_addr))) {
928                                         if ((so->so_options &
929                                             (SO_REUSEADDR | SO_REUSEPORT)) != 0)
930                                                 inp->inp_flags2 |= INP_REUSEPORT;
931                                         else
932                                                 inp->inp_flags2 &= ~INP_REUSEPORT;
933                                 }
934                                 INP_WUNLOCK(inp);
935                                 error = 0;
936                                 break;
937                         case SO_REUSEPORT:
938                                 INP_WLOCK(inp);
939                                 if ((so->so_options & SO_REUSEPORT) != 0)
940                                         inp->inp_flags2 |= INP_REUSEPORT;
941                                 else
942                                         inp->inp_flags2 &= ~INP_REUSEPORT;
943                                 INP_WUNLOCK(inp);
944                                 error = 0;
945                                 break;
946                         case SO_SETFIB:
947                                 INP_WLOCK(inp);
948                                 inp->inp_inc.inc_fibnum = so->so_fibnum;
949                                 INP_WUNLOCK(inp);
950                                 error = 0;
951                                 break;
952                         default:
953                                 break;
954                         }
955                 }
956                 return (error);
957         }
958
959         switch (sopt->sopt_dir) {
960         case SOPT_SET:
961                 switch (sopt->sopt_name) {
962                 case IP_OPTIONS:
963 #ifdef notyet
964                 case IP_RETOPTS:
965 #endif
966                 {
967                         struct mbuf *m;
968                         if (sopt->sopt_valsize > MLEN) {
969                                 error = EMSGSIZE;
970                                 break;
971                         }
972                         MGET(m, sopt->sopt_td ? M_WAIT : M_DONTWAIT, MT_DATA);
973                         if (m == NULL) {
974                                 error = ENOBUFS;
975                                 break;
976                         }
977                         m->m_len = sopt->sopt_valsize;
978                         error = sooptcopyin(sopt, mtod(m, char *), m->m_len,
979                                             m->m_len);
980                         if (error) {
981                                 m_free(m);
982                                 break;
983                         }
984                         INP_WLOCK(inp);
985                         error = ip_pcbopts(inp, sopt->sopt_name, m);
986                         INP_WUNLOCK(inp);
987                         return (error);
988                 }
989
990                 case IP_BINDANY:
991                         if (sopt->sopt_td != NULL) {
992                                 error = priv_check(sopt->sopt_td,
993                                     PRIV_NETINET_BINDANY);
994                                 if (error)
995                                         break;
996                         }
997                         /* FALLTHROUGH */
998                 case IP_TOS:
999                 case IP_TTL:
1000                 case IP_MINTTL:
1001                 case IP_RECVOPTS:
1002                 case IP_RECVRETOPTS:
1003                 case IP_RECVDSTADDR:
1004                 case IP_RECVTTL:
1005                 case IP_RECVIF:
1006                 case IP_FAITH:
1007                 case IP_ONESBCAST:
1008                 case IP_DONTFRAG:
1009                 case IP_RECVTOS:
1010                         error = sooptcopyin(sopt, &optval, sizeof optval,
1011                                             sizeof optval);
1012                         if (error)
1013                                 break;
1014
1015                         switch (sopt->sopt_name) {
1016                         case IP_TOS:
1017                                 inp->inp_ip_tos = optval;
1018                                 break;
1019
1020                         case IP_TTL:
1021                                 inp->inp_ip_ttl = optval;
1022                                 break;
1023
1024                         case IP_MINTTL:
1025                                 if (optval >= 0 && optval <= MAXTTL)
1026                                         inp->inp_ip_minttl = optval;
1027                                 else
1028                                         error = EINVAL;
1029                                 break;
1030
1031 #define OPTSET(bit) do {                                                \
1032         INP_WLOCK(inp);                                                 \
1033         if (optval)                                                     \
1034                 inp->inp_flags |= bit;                                  \
1035         else                                                            \
1036                 inp->inp_flags &= ~bit;                                 \
1037         INP_WUNLOCK(inp);                                               \
1038 } while (0)
1039
1040                         case IP_RECVOPTS:
1041                                 OPTSET(INP_RECVOPTS);
1042                                 break;
1043
1044                         case IP_RECVRETOPTS:
1045                                 OPTSET(INP_RECVRETOPTS);
1046                                 break;
1047
1048                         case IP_RECVDSTADDR:
1049                                 OPTSET(INP_RECVDSTADDR);
1050                                 break;
1051
1052                         case IP_RECVTTL:
1053                                 OPTSET(INP_RECVTTL);
1054                                 break;
1055
1056                         case IP_RECVIF:
1057                                 OPTSET(INP_RECVIF);
1058                                 break;
1059
1060                         case IP_FAITH:
1061                                 OPTSET(INP_FAITH);
1062                                 break;
1063
1064                         case IP_ONESBCAST:
1065                                 OPTSET(INP_ONESBCAST);
1066                                 break;
1067                         case IP_DONTFRAG:
1068                                 OPTSET(INP_DONTFRAG);
1069                                 break;
1070                         case IP_BINDANY:
1071                                 OPTSET(INP_BINDANY);
1072                                 break;
1073                         case IP_RECVTOS:
1074                                 OPTSET(INP_RECVTOS);
1075                                 break;
1076                         }
1077                         break;
1078 #undef OPTSET
1079
1080                 /*
1081                  * Multicast socket options are processed by the in_mcast
1082                  * module.
1083                  */
1084                 case IP_MULTICAST_IF:
1085                 case IP_MULTICAST_VIF:
1086                 case IP_MULTICAST_TTL:
1087                 case IP_MULTICAST_LOOP:
1088                 case IP_ADD_MEMBERSHIP:
1089                 case IP_DROP_MEMBERSHIP:
1090                 case IP_ADD_SOURCE_MEMBERSHIP:
1091                 case IP_DROP_SOURCE_MEMBERSHIP:
1092                 case IP_BLOCK_SOURCE:
1093                 case IP_UNBLOCK_SOURCE:
1094                 case IP_MSFILTER:
1095                 case MCAST_JOIN_GROUP:
1096                 case MCAST_LEAVE_GROUP:
1097                 case MCAST_JOIN_SOURCE_GROUP:
1098                 case MCAST_LEAVE_SOURCE_GROUP:
1099                 case MCAST_BLOCK_SOURCE:
1100                 case MCAST_UNBLOCK_SOURCE:
1101                         error = inp_setmoptions(inp, sopt);
1102                         break;
1103
1104                 case IP_PORTRANGE:
1105                         error = sooptcopyin(sopt, &optval, sizeof optval,
1106                                             sizeof optval);
1107                         if (error)
1108                                 break;
1109
1110                         INP_WLOCK(inp);
1111                         switch (optval) {
1112                         case IP_PORTRANGE_DEFAULT:
1113                                 inp->inp_flags &= ~(INP_LOWPORT);
1114                                 inp->inp_flags &= ~(INP_HIGHPORT);
1115                                 break;
1116
1117                         case IP_PORTRANGE_HIGH:
1118                                 inp->inp_flags &= ~(INP_LOWPORT);
1119                                 inp->inp_flags |= INP_HIGHPORT;
1120                                 break;
1121
1122                         case IP_PORTRANGE_LOW:
1123                                 inp->inp_flags &= ~(INP_HIGHPORT);
1124                                 inp->inp_flags |= INP_LOWPORT;
1125                                 break;
1126
1127                         default:
1128                                 error = EINVAL;
1129                                 break;
1130                         }
1131                         INP_WUNLOCK(inp);
1132                         break;
1133
1134 #ifdef IPSEC
1135                 case IP_IPSEC_POLICY:
1136                 {
1137                         caddr_t req;
1138                         struct mbuf *m;
1139
1140                         if ((error = soopt_getm(sopt, &m)) != 0) /* XXX */
1141                                 break;
1142                         if ((error = soopt_mcopyin(sopt, m)) != 0) /* XXX */
1143                                 break;
1144                         req = mtod(m, caddr_t);
1145                         error = ipsec_set_policy(inp, sopt->sopt_name, req,
1146                             m->m_len, (sopt->sopt_td != NULL) ?
1147                             sopt->sopt_td->td_ucred : NULL);
1148                         m_freem(m);
1149                         break;
1150                 }
1151 #endif /* IPSEC */
1152
1153                 default:
1154                         error = ENOPROTOOPT;
1155                         break;
1156                 }
1157                 break;
1158
1159         case SOPT_GET:
1160                 switch (sopt->sopt_name) {
1161                 case IP_OPTIONS:
1162                 case IP_RETOPTS:
1163                         if (inp->inp_options)
1164                                 error = sooptcopyout(sopt, 
1165                                                      mtod(inp->inp_options,
1166                                                           char *),
1167                                                      inp->inp_options->m_len);
1168                         else
1169                                 sopt->sopt_valsize = 0;
1170                         break;
1171
1172                 case IP_TOS:
1173                 case IP_TTL:
1174                 case IP_MINTTL:
1175                 case IP_RECVOPTS:
1176                 case IP_RECVRETOPTS:
1177                 case IP_RECVDSTADDR:
1178                 case IP_RECVTTL:
1179                 case IP_RECVIF:
1180                 case IP_PORTRANGE:
1181                 case IP_FAITH:
1182                 case IP_ONESBCAST:
1183                 case IP_DONTFRAG:
1184                 case IP_BINDANY:
1185                 case IP_RECVTOS:
1186                         switch (sopt->sopt_name) {
1187
1188                         case IP_TOS:
1189                                 optval = inp->inp_ip_tos;
1190                                 break;
1191
1192                         case IP_TTL:
1193                                 optval = inp->inp_ip_ttl;
1194                                 break;
1195
1196                         case IP_MINTTL:
1197                                 optval = inp->inp_ip_minttl;
1198                                 break;
1199
1200 #define OPTBIT(bit)     (inp->inp_flags & bit ? 1 : 0)
1201
1202                         case IP_RECVOPTS:
1203                                 optval = OPTBIT(INP_RECVOPTS);
1204                                 break;
1205
1206                         case IP_RECVRETOPTS:
1207                                 optval = OPTBIT(INP_RECVRETOPTS);
1208                                 break;
1209
1210                         case IP_RECVDSTADDR:
1211                                 optval = OPTBIT(INP_RECVDSTADDR);
1212                                 break;
1213
1214                         case IP_RECVTTL:
1215                                 optval = OPTBIT(INP_RECVTTL);
1216                                 break;
1217
1218                         case IP_RECVIF:
1219                                 optval = OPTBIT(INP_RECVIF);
1220                                 break;
1221
1222                         case IP_PORTRANGE:
1223                                 if (inp->inp_flags & INP_HIGHPORT)
1224                                         optval = IP_PORTRANGE_HIGH;
1225                                 else if (inp->inp_flags & INP_LOWPORT)
1226                                         optval = IP_PORTRANGE_LOW;
1227                                 else
1228                                         optval = 0;
1229                                 break;
1230
1231                         case IP_FAITH:
1232                                 optval = OPTBIT(INP_FAITH);
1233                                 break;
1234
1235                         case IP_ONESBCAST:
1236                                 optval = OPTBIT(INP_ONESBCAST);
1237                                 break;
1238                         case IP_DONTFRAG:
1239                                 optval = OPTBIT(INP_DONTFRAG);
1240                                 break;
1241                         case IP_BINDANY:
1242                                 optval = OPTBIT(INP_BINDANY);
1243                                 break;
1244                         case IP_RECVTOS:
1245                                 optval = OPTBIT(INP_RECVTOS);
1246                                 break;
1247                         }
1248                         error = sooptcopyout(sopt, &optval, sizeof optval);
1249                         break;
1250
1251                 /*
1252                  * Multicast socket options are processed by the in_mcast
1253                  * module.
1254                  */
1255                 case IP_MULTICAST_IF:
1256                 case IP_MULTICAST_VIF:
1257                 case IP_MULTICAST_TTL:
1258                 case IP_MULTICAST_LOOP:
1259                 case IP_MSFILTER:
1260                         error = inp_getmoptions(inp, sopt);
1261                         break;
1262
1263 #ifdef IPSEC
1264                 case IP_IPSEC_POLICY:
1265                 {
1266                         struct mbuf *m = NULL;
1267                         caddr_t req = NULL;
1268                         size_t len = 0;
1269
1270                         if (m != 0) {
1271                                 req = mtod(m, caddr_t);
1272                                 len = m->m_len;
1273                         }
1274                         error = ipsec_get_policy(sotoinpcb(so), req, len, &m);
1275                         if (error == 0)
1276                                 error = soopt_mcopyout(sopt, m); /* XXX */
1277                         if (error == 0)
1278                                 m_freem(m);
1279                         break;
1280                 }
1281 #endif /* IPSEC */
1282
1283                 default:
1284                         error = ENOPROTOOPT;
1285                         break;
1286                 }
1287                 break;
1288         }
1289         return (error);
1290 }
1291
1292 /*
1293  * Routine called from ip_output() to loop back a copy of an IP multicast
1294  * packet to the input queue of a specified interface.  Note that this
1295  * calls the output routine of the loopback "driver", but with an interface
1296  * pointer that might NOT be a loopback interface -- evil, but easier than
1297  * replicating that code here.
1298  *
1299  * IP header in host byte order.
1300  */
1301 static void
1302 ip_mloopback(struct ifnet *ifp, struct mbuf *m, struct sockaddr_in *dst,
1303     int hlen)
1304 {
1305         register struct ip *ip;
1306         struct mbuf *copym;
1307
1308         /*
1309          * Make a deep copy of the packet because we're going to
1310          * modify the pack in order to generate checksums.
1311          */
1312         copym = m_dup(m, M_DONTWAIT);
1313         if (copym != NULL && (copym->m_flags & M_EXT || copym->m_len < hlen))
1314                 copym = m_pullup(copym, hlen);
1315         if (copym != NULL) {
1316                 ip = mtod(copym, struct ip *);
1317                 ip->ip_len = htons(ip->ip_len);
1318                 ip->ip_off = htons(ip->ip_off);
1319                 /* If needed, compute the checksum and mark it as valid. */
1320                 if (copym->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
1321                         in_delayed_cksum(copym);
1322                         copym->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
1323                         copym->m_pkthdr.csum_flags |=
1324                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
1325                         copym->m_pkthdr.csum_data = 0xffff;
1326                 }
1327                 /*
1328                  * We don't bother to fragment if the IP length is greater
1329                  * than the interface's MTU.  Can this possibly matter?
1330                  */
1331                 ip->ip_sum = 0;
1332                 ip->ip_sum = in_cksum(copym, hlen);
1333 #if 1 /* XXX */
1334                 if (dst->sin_family != AF_INET) {
1335                         printf("ip_mloopback: bad address family %d\n",
1336                                                 dst->sin_family);
1337                         dst->sin_family = AF_INET;
1338                 }
1339 #endif
1340                 if_simloop(ifp, copym, dst->sin_family, 0);
1341         }
1342 }