* Copyright (c) 1984, 1985, 1986, 1987 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* @(#)ns_output.c 7.8 (Berkeley) 12/16/90
#include "../net/route.h"
#include "vax/include/mtpr.h"
register struct idp
*idp
= mtod(m0
, struct idp
*);
register struct ifnet
*ifp
= 0;
(void)m_free(ns_lastout
);
ns_lastout
= m_copy(m0
, 0, (int)M_COPYALL
);
bzero((caddr_t
)ro
, sizeof (*ro
));
dst
= (struct sockaddr_ns
*)&ro
->ro_dst
;
dst
->sns_len
= sizeof (*dst
);
dst
->sns_addr
= idp
->idp_dna
;
dst
->sns_addr
.x_port
= 0;
* If routing to interface only,
* short circuit routing lookup.
if (flags
& NS_ROUTETOIF
) {
struct ns_ifaddr
*ia
= ns_iaonnetof(&idp
->idp_dna
);
} else if ((ro
->ro_rt
->rt_flags
& RTF_UP
) == 0) {
* The old route has gone away; try for a new one.
if (ro
->ro_rt
== 0 || (ifp
= ro
->ro_rt
->rt_ifp
) == 0) {
if (ro
->ro_rt
->rt_flags
& (RTF_GATEWAY
|RTF_HOST
))
dst
= (struct sockaddr_ns
*)ro
->ro_rt
->rt_gateway
;
* Look for multicast addresses and
* and verify user is allowed to send
if (dst
->sns_addr
.x_host
.c_host
[0]&1) {
if ((ifp
->if_flags
& IFF_BROADCAST
) == 0) {
if ((flags
& NS_ALLOWBROADCAST
) == 0) {
if (htons(idp
->idp_len
) <= ifp
->if_mtu
) {
ns_watch_output(m0
, ifp
);
error
= (*ifp
->if_output
)(ifp
, m0
,
(struct sockaddr
*)dst
, ro
->ro_rt
);
ns_watch_output(m0
, ifp
);
if (ro
== &idproute
&& (flags
& NS_ROUTETOIF
) == 0 && ro
->ro_rt
) {