* Copyright (c) 1984, 1985, 1986 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
* @(#)ns_output.c 7.1 (Berkeley) %G%
#include "../net/route.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_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
);
ns_watch_output(m0
, ifp
);
if (ro
== &idproute
&& (flags
& NS_ROUTETOIF
) == 0 && ro
->ro_rt
)