summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/net/if.c6
-rw-r--r--sys/net/if_pfsync.c13
-rw-r--r--sys/netinet/ip_carp.c65
-rw-r--r--sys/netinet/ip_carp.h4
4 files changed, 55 insertions, 33 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 64e34aafb64..2a8fe3c5268 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.213 2010/04/17 18:31:41 stsp Exp $ */
+/* $OpenBSD: if.c,v 1.214 2010/04/25 17:38:53 mpf Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -1512,10 +1512,10 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
case SIOCAIFGROUP:
if ((error = suser(p, 0)))
return (error);
- (*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
ifgr = (struct ifgroupreq *)data;
if ((error = if_addgroup(ifp, ifgr->ifgr_group)))
return (error);
+ (*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
break;
case SIOCGIFGROUP:
@@ -2000,7 +2000,7 @@ if_setgroupattribs(caddr_t data)
demote = ifgr->ifgr_attrib.ifg_carp_demoted;
if (demote + ifg->ifg_carp_demoted > 0xff ||
demote + ifg->ifg_carp_demoted < 0)
- return (ERANGE);
+ return (EINVAL);
ifg->ifg_carp_demoted += demote;
diff --git a/sys/net/if_pfsync.c b/sys/net/if_pfsync.c
index e3329f77d79..8e279d0091e 100644
--- a/sys/net/if_pfsync.c
+++ b/sys/net/if_pfsync.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pfsync.c,v 1.144 2010/03/23 22:34:49 pyr Exp $ */
+/* $OpenBSD: if_pfsync.c,v 1.145 2010/04/25 17:38:53 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff
@@ -353,7 +353,7 @@ pfsync_clone_destroy(struct ifnet *ifp)
timeout_del(&sc->sc_tmo);
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1, "pfsync destroy");
#endif
#if NBPFILTER > 0
bpfdetach(ifp);
@@ -1194,7 +1194,8 @@ pfsync_in_bus(struct pfsync_pkt *pkt, caddr_t buf, int len, int count)
timeout_del(&sc->sc_bulkfail_tmo);
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1,
+ "pfsync bulk done");
#endif
pfsync_sync_ok = 1;
DPFPRINTF(LOG_INFO, "received valid bulk update end");
@@ -1888,7 +1889,8 @@ pfsync_request_full_update(struct pfsync_softc *sc)
sc->sc_ureq_sent = time_uptime;
#if NCARP > 0
if (pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, 1);
+ carp_group_demote_adj(&sc->sc_if, 1,
+ "pfsync bulk start");
#endif
pfsync_sync_ok = 0;
DPFPRINTF(LOG_INFO, "requesting bulk update");
@@ -2261,7 +2263,8 @@ pfsync_bulk_fail(void *arg)
sc->sc_bulk_tries = 0;
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1,
+ "pfsync bulk fail");
#endif
pfsync_sync_ok = 1;
DPFPRINTF(LOG_ERR, "failed to receive bulk update");
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index f00d0fdc613..af64fd19e40 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip_carp.c,v 1.174 2010/01/13 01:26:28 henning Exp $ */
+/* $OpenBSD: ip_carp.c,v 1.175 2010/04/25 17:38:53 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -141,6 +141,7 @@ struct carp_softc {
int sc_suppress;
int sc_bow_out;
+ int sc_demote_cnt;
int sc_sendad_errors;
#define CARP_SENDAD_MAX_ERRORS(sc) (3 * (sc)->sc_vhe_count)
@@ -970,12 +971,9 @@ carpdetach(struct carp_softc *sc)
carp_del_all_timeouts(sc);
- if (sc->sc_suppress)
- carp_group_demote_adj(&sc->sc_if, -1);
+ if (sc->sc_demote_cnt)
+ carp_group_demote_adj(&sc->sc_if, sc->sc_demote_cnt, "detach");
sc->sc_suppress = 0;
-
- if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS(sc))
- carp_group_demote_adj(&sc->sc_if, -1);
sc->sc_sendad_errors = 0;
carp_set_state_all(sc, INIT);
@@ -1189,13 +1187,15 @@ carp_send_ad(void *v)
if (sc->sc_sendad_errors < INT_MAX)
sc->sc_sendad_errors++;
if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS(sc))
- carp_group_demote_adj(&sc->sc_if, 1);
+ carp_group_demote_adj(&sc->sc_if, 1,
+ "> snderrors");
sc->sc_sendad_success = 0;
} else {
if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS(sc)) {
if (++sc->sc_sendad_success >=
CARP_SENDAD_MIN_SUCCESS(sc)) {
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1,
+ "< snderrors");
sc->sc_sendad_errors = 0;
}
} else
@@ -1274,13 +1274,15 @@ carp_send_ad(void *v)
if (sc->sc_sendad_errors < INT_MAX)
sc->sc_sendad_errors++;
if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS(sc))
- carp_group_demote_adj(&sc->sc_if, 1);
+ carp_group_demote_adj(&sc->sc_if, 1,
+ "> snd6errors");
sc->sc_sendad_success = 0;
} else {
if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS(sc)) {
if (++sc->sc_sendad_success >=
CARP_SENDAD_MIN_SUCCESS(sc)) {
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1,
+ "< snd6errors");
sc->sc_sendad_errors = 0;
}
} else
@@ -2341,7 +2343,7 @@ carp_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr)
break;
case SIOCAIFGROUP:
case SIOCDIFGROUP:
- if (sc->sc_suppress)
+ if (sc->sc_demote_cnt)
carp_ifgroup_ioctl(ifp, cmd, addr);
break;
case SIOCSIFGATTR:
@@ -2443,16 +2445,21 @@ carp_ifgroup_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr)
{
struct ifgroupreq *ifgr = (struct ifgroupreq *)addr;
struct ifg_list *ifgl;
+ int *dm, adj;
if (!strcmp(ifgr->ifgr_group, IFG_ALL))
return;
+ adj = ((struct carp_softc *)ifp->if_softc)->sc_demote_cnt;
+ if (cmd == SIOCDIFGROUP)
+ adj = adj * -1;
+
TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next)
if (!strcmp(ifgl->ifgl_group->ifg_group, ifgr->ifgr_group)) {
- if (cmd == SIOCAIFGROUP)
- ifgl->ifgl_group->ifg_carp_demoted++;
- else if (cmd == SIOCDIFGROUP &&
- ifgl->ifgl_group->ifg_carp_demoted)
- ifgl->ifgl_group->ifg_carp_demoted--;
+ dm = &ifgl->ifgl_group->ifg_carp_demoted;
+ if (*dm + adj >= 0)
+ *dm += adj;
+ else
+ *dm = 0;
}
}
@@ -2550,12 +2557,20 @@ carp_set_state(struct carp_vhost_entry *vhe, int state)
}
void
-carp_group_demote_adj(struct ifnet *ifp, int adj)
+carp_group_demote_adj(struct ifnet *ifp, int adj, char *reason)
{
struct ifg_list *ifgl;
int *dm;
struct carp_softc *nil = NULL;
+ if (ifp->if_type == IFT_CARP) {
+ dm = &((struct carp_softc *)ifp->if_softc)->sc_demote_cnt;
+ if (*dm + adj >= 0)
+ *dm += adj;
+ else
+ *dm = 0;
+ }
+
TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
if (!strcmp(ifgl->ifgl_group->ifg_group, IFG_ALL))
continue;
@@ -2568,8 +2583,10 @@ carp_group_demote_adj(struct ifnet *ifp, int adj)
if (adj > 0 && *dm == 1)
carp_send_ad_all();
- CARP_LOG(LOG_INFO, nil, ("%s demoted group %s to %d", ifp->if_xname,
- ifgl->ifgl_group->ifg_group, *dm));
+ CARP_LOG(LOG_NOTICE, nil,
+ ("%s demoted group %s by %d to %d (%s)",
+ ifp->if_xname, ifgl->ifgl_group->ifg_group,
+ adj, *dm, reason));
}
}
@@ -2582,6 +2599,9 @@ carp_group_demote_count(struct carp_softc *sc)
TAILQ_FOREACH(ifgl, &sc->sc_if.if_groups, ifgl_next)
count += ifgl->ifgl_group->ifg_carp_demoted;
+ if (count == 0 && sc->sc_demote_cnt)
+ count = sc->sc_demote_cnt;
+
return (count > 255 ? 255 : count);
}
@@ -2608,13 +2628,12 @@ carp_carpdev_state(void *v)
sc->sc_suppress = 1;
carp_setrun_all(sc, 0);
if (!suppressed)
- carp_group_demote_adj(&sc->sc_if, 1);
- } else {
+ carp_group_demote_adj(&sc->sc_if, 1, "carpdev");
+ } else if (suppressed) {
carp_set_state_all(sc, INIT);
sc->sc_suppress = 0;
carp_setrun_all(sc, 0);
- if (suppressed)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_group_demote_adj(&sc->sc_if, -1, "carpdev");
}
}
}
diff --git a/sys/netinet/ip_carp.h b/sys/netinet/ip_carp.h
index 145bc9d4023..57155e2313c 100644
--- a/sys/netinet/ip_carp.h
+++ b/sys/netinet/ip_carp.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip_carp.h,v 1.27 2008/06/14 21:46:22 reyk Exp $ */
+/* $OpenBSD: ip_carp.h,v 1.28 2010/04/25 17:38:53 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -166,7 +166,7 @@ struct carpreq {
void carp_ifdetach (struct ifnet *);
void carp_proto_input (struct mbuf *, ...);
void carp_carpdev_state(void *);
-void carp_group_demote_adj(struct ifnet *, int);
+void carp_group_demote_adj(struct ifnet *, int, char *);
int carp6_proto_input(struct mbuf **, int *, int);
int carp_iamatch(struct in_ifaddr *, u_char *, u_int8_t **,
u_int8_t **);