* Copyright (c) 1984, 1985, 1986, 1987 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* @(#)ns_output.c 7.6 (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_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
) {