output.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 155 行
C
155 行
#ifndef lintstatic char *sccsid = "@(#)output.c 4.1 (ULTRIX) 7/2/90";#endif lint/************************************************************************ * * * Copyright (c) 1984,1988 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************//* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. *//*#ifndef lintstatic char sccsid[] = "@(#)output.c 4.1 (Berkeley) 7/2/90";#endif not lint*//* * Routing Table Management Daemon */#include "defs.h"/* * Apply the function "f" to all non-passive * interfaces. If the interface supports the * use of broadcasting use it, otherwise address * the output to the known router. */toall(f) int (*f)();{ register struct interface *ifp; register struct sockaddr *dst; register int flags; extern struct interface *ifnet; for (ifp = ifnet; ifp; ifp = ifp->int_next) { printf("toall %x\n", ifp); if (ifp->int_flags & IFF_PASSIVE) continue; dst = ifp->int_flags & IFF_BROADCAST ? &ifp->int_broadaddr : ifp->int_flags & IFF_POINTOPOINT ? &ifp->int_dstaddr : &ifp->int_addr; flags = ifp->int_flags & IFF_INTERFACE ? MSG_DONTROUTE : 0; (*f)(dst, flags, ifp); }}/* * Output a preformed packet. *//*ARGSUSED*/sendmsg(dst, flags, ifp) struct sockaddr *dst; int flags; struct interface *ifp;{ (*afswitch[dst->sa_family].af_output)(s, flags, dst, sizeof (struct rip)); TRACE_OUTPUT(ifp, dst, sizeof (struct rip));}/* * Supply dst with the contents of the routing tables. * If this won't fit in one packet, chop it up into several. */supply(dst, flags, ifp) struct sockaddr *dst; int flags; register struct interface *ifp;{ register struct rt_entry *rt; register struct netinfo *n = msg->rip_nets; register struct rthash *rh; struct rthash *base = hosthash; int doinghost = 1, size; int (*output)() = afswitch[dst->sa_family].af_output; int (*sendroute)() = afswitch[dst->sa_family].af_sendroute; int npackets = 0; msg->rip_cmd = RIPCMD_RESPONSE; msg->rip_vers = RIPVERSION; bzero(msg->rip_res1, sizeof(msg->rip_res1));again: for (rh = base; rh < &base[ROUTEHASHSIZ]; rh++) for (rt = rh->rt_forw; rt != (struct rt_entry *)rh; rt = rt->rt_forw) { /* * Don't resend the information on the network * from which it was received (unless sending * in response to a query). */ if (ifp && rt->rt_ifp == ifp && (rt->rt_state & RTS_INTERFACE) == 0) continue; if (rt->rt_state & RTS_EXTERNAL) continue; /* * Limit the spread of subnet information * to those who are interested. */ if (doinghost == 0 && rt->rt_state & RTS_SUBNET) { if (rt->rt_dst.sa_family != dst->sa_family) continue; if ((*sendroute)(rt, dst) == 0) continue; } size = (char *)n - packet; if (size > MAXPACKETSIZE - sizeof (struct netinfo)) { (*output)(s, flags, dst, size); TRACE_OUTPUT(ifp, dst, size); n = msg->rip_nets; npackets++; } n->rip_dst = rt->rt_dst; n->rip_dst.sa_family = htons(n->rip_dst.sa_family); n->rip_metric = htonl(min(rt->rt_metric + 1, HOPCNT_INFINITY)); n++; } if (doinghost) { doinghost = 0; base = nethash; goto again; } if (n != msg->rip_nets || npackets == 0) { size = (char *)n - packet; (*output)(s, flags, dst, size); TRACE_OUTPUT(ifp, dst, size); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?