summary |
tags |
clone url |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
cf3fbaa)
(so can advertise deletion)
SCCS-vsn: sbin/routed/input.c 5.7
SCCS-vsn: sbin/routed/tables.c 5.6
-static char sccsid[] = "@(#)input.c 5.6 (Berkeley) %G%";
+static char sccsid[] = "@(#)input.c 5.7 (Berkeley) %G%";
struct interface *if_ifwithdstaddr();
int newsize;
register struct afswitch *afp;
struct interface *if_ifwithdstaddr();
int newsize;
register struct afswitch *afp;
+ static struct sockaddr badfrom;
ifp = 0;
TRACE_INPUT(ifp, from, size);
ifp = 0;
TRACE_INPUT(ifp, from, size);
return;
if (if_iflookup(from) == 0) {
syslog(LOG_ERR, "trace command from unknown router, %s",
return;
if (if_iflookup(from) == 0) {
syslog(LOG_ERR, "trace command from unknown router, %s",
- (*afswitch[from->sa_family].af_format)(from));
+ (*afswitch[from->sa_family].af_format)(from));
return;
}
packet[size] = '\0';
return;
}
packet[size] = '\0';
else if (ifp = if_ifwithdstaddr(from))
addrouteforif(ifp);
else if (if_iflookup(from) == 0) {
else if (ifp = if_ifwithdstaddr(from))
addrouteforif(ifp);
else if (if_iflookup(from) == 0) {
- syslog(LOG_ERR, "packet from unknown router, %s",
- (*afswitch[from->sa_family].af_format)(from));
+ if (bcmp((char *)from, (char *)&badfrom,
+ sizeof(badfrom)) != 0) {
+ syslog(LOG_ERR,
+ "packet from unknown router, %s",
+ (*afswitch[from->sa_family].af_format)(from));
+ badfrom = *from;
+ }
return;
}
size -= 4 * sizeof (char);
return;
}
size -= 4 * sizeof (char);
* shorter, or getting stale and equivalent.
*/
if (equal(from, &rt->rt_router)) {
* shorter, or getting stale and equivalent.
*/
if (equal(from, &rt->rt_router)) {
- if (n->rip_metric == HOPCNT_INFINITY) {
- rtdelete(rt);
- continue;
- }
if (n->rip_metric != rt->rt_metric)
rtchange(rt, from, n->rip_metric);
rt->rt_timer = 0;
if (n->rip_metric != rt->rt_metric)
rtchange(rt, from, n->rip_metric);
rt->rt_timer = 0;
-static char sccsid[] = "@(#)tables.c 5.5 (Berkeley) %G%";
+static char sccsid[] = "@(#)tables.c 5.6 (Berkeley) %G%";
struct sockaddr *gate;
short metric;
{
struct sockaddr *gate;
short metric;
{
- int doioctl = 0, metricchanged = 0;
+ int doioctl = 0, metricchanged = 0, delete = 0;
struct rtentry oldroute;
if (!equal(&rt->rt_router, gate) && (rt->rt_state & RTS_INTERNAL) == 0)
doioctl++;
struct rtentry oldroute;
if (!equal(&rt->rt_router, gate) && (rt->rt_state & RTS_INTERNAL) == 0)
doioctl++;
- if (metric != rt->rt_metric)
+ if (metric != rt->rt_metric) {
+ if (metric == HOPCNT_INFINITY)
+ delete++;
+ }
if (doioctl || metricchanged) {
TRACE_ACTION(CHANGE FROM, rt);
if ((rt->rt_state & RTS_INTERFACE) && metric) {
if (doioctl || metricchanged) {
TRACE_ACTION(CHANGE FROM, rt);
if ((rt->rt_state & RTS_INTERFACE) && metric) {
rt->rt_state |= RTS_CHANGED;
TRACE_ACTION(CHANGE TO, rt);
}
rt->rt_state |= RTS_CHANGED;
TRACE_ACTION(CHANGE TO, rt);
}
- if (doioctl && install) {
+ if (doioctl && install)
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
perror("SIOCADDRT");
if (ioctl(s, SIOCADDRT, (char *)&rt->rt_rt) < 0)
perror("SIOCADDRT");
+ if ((doioctl || delete) && install)
if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
if (ioctl(s, SIOCDELRT, (char *)&oldroute) < 0)
perror("SIOCDELRT");
rt->rt_ifp->int_name);
TRACE_ACTION(DELETE, rt);
if (install && (rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 &&
rt->rt_ifp->int_name);
TRACE_ACTION(DELETE, rt);
if (install && (rt->rt_state & (RTS_INTERNAL | RTS_EXTERNAL)) == 0 &&
+ rt->rt_metric != HOPCNT_INFINITY &&
ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
perror("SIOCDELRT");
remque(rt);
ioctl(s, SIOCDELRT, (char *)&rt->rt_rt))
perror("SIOCDELRT");
remque(rt);