summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sbin/ifconfig/ifconfig.817
-rw-r--r--sbin/ifconfig/ifconfig.c57
-rw-r--r--sys/net/if.c55
-rw-r--r--sys/net/if.h13
-rw-r--r--sys/net/if_pfsync.c14
-rw-r--r--sys/netinet/ip_carp.c114
-rw-r--r--sys/netinet/ip_carp.h7
-rw-r--r--sys/sys/sockio.h4
8 files changed, 239 insertions, 42 deletions
diff --git a/sbin/ifconfig/ifconfig.8 b/sbin/ifconfig/ifconfig.8
index 3a7c3474de1..a36a8368fbe 100644
--- a/sbin/ifconfig/ifconfig.8
+++ b/sbin/ifconfig/ifconfig.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: ifconfig.8,v 1.121 2006/05/17 12:10:16 jmc Exp $
+.\" $OpenBSD: ifconfig.8,v 1.122 2006/06/02 19:53:12 mpf Exp $
.\" $NetBSD: ifconfig.8,v 1.11 1996/01/04 21:27:29 pk Exp $
.\" $FreeBSD: ifconfig.8,v 1.16 1998/02/01 07:03:29 steve Exp $
.\"
@@ -52,6 +52,10 @@
.Nm ifconfig
.Fl C
.Nm ifconfig
+.Fl g
+.Ar group-name
+.Op Ar group_parameters
+.Nm ifconfig
.Ar interface
.Cm create
.Nm ifconfig
@@ -200,6 +204,9 @@ In Host AP mode, this will dump the list of known nodes.
.It Fl m Ar interface
Print media information for a given
.Ar interface .
+.It Fl m Ar group-name
+Print or configure group attributes for a given
+.Ar group-name .
.It Ar address
For the
.Tn DARPA
@@ -374,6 +381,14 @@ Set the desired BSSID for IEEE 802.11-based wireless network interfaces.
Unset the desired BSSID for IEEE 802.11-based wireless network interfaces.
The interface will automatically select a BSSID in this mode, which is
the default.
+.It Cm carpdemote
+Increase
+.Xr carp 4
+demote count for given interface group.
+.It Fl carpdemote
+Decrease
+.Xr carp 4
+demote count for given interface group.
.It Cm carpdev Ar iface
If the driver is a
.Xr carp 4
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 2528940c5a5..07b1a1ec675 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ifconfig.c,v 1.162 2006/06/01 21:01:10 claudio Exp $ */
+/* $OpenBSD: ifconfig.c,v 1.163 2006/06/02 19:53:12 mpf Exp $ */
/* $NetBSD: ifconfig.c,v 1.40 1997/10/01 02:19:43 enami Exp $ */
/*
@@ -380,6 +380,8 @@ const struct cmd {
int getinfo(struct ifreq *, int);
void getsock(int);
int printgroup(char *, int);
+void printgroupattribs(char *);
+void setgroupattribs(char *, int, char *[]);
void printif(char *, int);
void printb(char *, unsigned short, char *);
void printb_status(unsigned short, char *);
@@ -459,6 +461,7 @@ main(int argc, char *argv[])
int aflag = 0;
int ifaliases = 0;
int Cflag = 0;
+ int gflag = 0;
int i;
/* If no args at all, print all interfaces. */
@@ -481,6 +484,9 @@ main(int argc, char *argv[])
ifaliases = 1;
nomore = 1;
break;
+ case 'g':
+ gflag = 1;
+ break;
case 'm':
mflag = 1;
break;
@@ -523,6 +529,13 @@ main(int argc, char *argv[])
list_cloners();
exit(0);
}
+ if (gflag) {
+ if (argc == 0)
+ printgroupattribs(name);
+ else
+ setgroupattribs(name, argc, argv);
+ exit(0);
+ }
if (aflag) {
if (argc > 0)
usage(0);
@@ -726,6 +739,47 @@ printgroup(char *groupname, int ifaliases)
}
void
+printgroupattribs(char *groupname)
+{
+ struct ifgroupreq ifgr;
+
+ getsock(AF_INET);
+ bzero(&ifgr, sizeof(ifgr));
+ strlcpy(ifgr.ifgr_name, groupname, sizeof(ifgr.ifgr_name));
+ if (ioctl(s, SIOCGIFGATTR, (caddr_t)&ifgr) == -1)
+ err(1, "SIOCGIFGATTR");
+
+ printf("%s:", groupname);
+ printf(" carp demote count %d", ifgr.ifgr_attrib.ifg_carp_demoted);
+ printf("\n");
+}
+
+void
+setgroupattribs(char *groupname, int argc, char *argv[])
+{
+ char *p = argv[0];
+ int neg = 1;
+
+ struct ifgroupreq ifgr;
+ struct ifg_attrib *ifga;
+
+ getsock(AF_INET);
+ bzero(&ifgr, sizeof(ifgr));
+ strlcpy(ifgr.ifgr_name, groupname, sizeof(ifgr.ifgr_name));
+ if (p[0] == '-') {
+ neg = -1;
+ p++;
+ }
+ if (!strcmp(p, "carpdemote"))
+ ifgr.ifgr_attrib.ifg_carp_demoted = neg;
+ else
+ usage(1);
+
+ if (ioctl(s, SIOCSIFGATTR, (caddr_t)&ifgr) == -1)
+ err(1, "SIOCSIFGATTR");
+}
+
+void
printif(char *ifname, int ifaliases)
{
struct ifaddrs *ifap, *ifa;
@@ -3811,6 +3865,7 @@ usage(int value)
"\t[authname name] [authkey key] [peerproto proto]\n"
"\t[peername name] [peerkey key] [[-]peerflag flag]\n"
" ifconfig [-AaCMm] [interface] [address_family]\n"
+ " ifconfig -g group-name [[-]carpdemote]\n"
" ifconfig interface create\n"
" ifconfig interface destroy\n");
exit(value);
diff --git a/sys/net/if.c b/sys/net/if.c
index 4b97d064b0c..97b517fa1f9 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.146 2006/03/22 14:37:44 henning Exp $ */
+/* $OpenBSD: if.c,v 1.147 2006/06/02 19:53:12 mpf Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -137,6 +137,8 @@ void if_detached_watchdog(struct ifnet *);
int if_getgroup(caddr_t, struct ifnet *);
int if_getgroupmembers(caddr_t);
+int if_getgroupattribs(caddr_t);
+int if_setgroupattribs(caddr_t);
int if_clone_list(struct if_clonereq *);
struct if_clone *if_clone_lookup(const char *, int *);
@@ -1167,6 +1169,12 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
return (if_clone_list((struct if_clonereq *)data));
case SIOCGIFGMEMB:
return (if_getgroupmembers(data));
+ case SIOCGIFGATTR:
+ return (if_getgroupattribs(data));
+ case SIOCSIFGATTR:
+ if ((error = suser(p, 0)) != 0)
+ return (error);
+ return (if_setgroupattribs(data));
}
ifp = ifunit(ifr->ifr_name);
@@ -1280,6 +1288,7 @@ 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);
@@ -1293,6 +1302,7 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p)
case SIOCDIFGROUP:
if ((error = suser(p, 0)))
return (error);
+ (*ifp->if_ioctl)(ifp, cmd, data); /* XXX error check */
ifgr = (struct ifgroupreq *)data;
if ((error = if_delgroup(ifp, ifgr->ifgr_group)))
return (error);
@@ -1590,6 +1600,7 @@ if_addgroup(struct ifnet *ifp, const char *groupname)
}
strlcpy(ifg->ifg_group, groupname, sizeof(ifg->ifg_group));
ifg->ifg_refcnt = 0;
+ ifg->ifg_carp_demoted = 0;
TAILQ_INIT(&ifg->ifg_members);
#if NPF > 0
pfi_attach_ifgroup(ifg);
@@ -1732,6 +1743,48 @@ if_getgroupmembers(caddr_t data)
return (0);
}
+int
+if_getgroupattribs(caddr_t data)
+{
+ struct ifgroupreq *ifgr = (struct ifgroupreq *)data;
+ struct ifg_group *ifg;
+
+ TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
+ if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
+ break;
+ if (ifg == NULL)
+ return (ENOENT);
+
+ ifgr->ifgr_attrib.ifg_carp_demoted = ifg->ifg_carp_demoted;
+
+ return (0);
+}
+
+int
+if_setgroupattribs(caddr_t data)
+{
+ struct ifgroupreq *ifgr = (struct ifgroupreq *)data;
+ struct ifg_group *ifg;
+ int demote;
+
+ TAILQ_FOREACH(ifg, &ifg_head, ifg_next)
+ if (!strcmp(ifg->ifg_group, ifgr->ifgr_name))
+ break;
+ if (ifg == NULL)
+ return (ENOENT);
+
+ demote = ifgr->ifgr_attrib.ifg_carp_demoted;
+ if (demote > 1 || demote < -1)
+ return (E2BIG);
+
+ if (demote + ifg->ifg_carp_demoted >= 0)
+ ifg->ifg_carp_demoted += demote;
+ else
+ ifg->ifg_carp_demoted = 0;
+
+ return (0);
+}
+
void
if_group_routechange(struct sockaddr *dst, struct sockaddr *mask)
{
diff --git a/sys/net/if.h b/sys/net/if.h
index cef94421001..2e54ccd76ad 100644
--- a/sys/net/if.h
+++ b/sys/net/if.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.h,v 1.81 2006/05/27 10:03:15 brad Exp $ */
+/* $OpenBSD: if.h,v 1.82 2006/06/02 19:53:12 mpf Exp $ */
/* $NetBSD: if.h,v 1.23 1996/05/07 02:40:27 thorpej Exp $ */
/*
@@ -433,6 +433,7 @@ struct ifg_group {
char ifg_group[IFNAMSIZ];
u_int ifg_refcnt;
caddr_t ifg_pf_kif;
+ int ifg_carp_demoted;
TAILQ_HEAD(, ifg_member) ifg_members;
TAILQ_ENTRY(ifg_group) ifg_next;
};
@@ -456,6 +457,10 @@ struct ifg_req {
#define ifgrq_member ifgrq_ifgrqu.ifgrqu_member
};
+struct ifg_attrib {
+ int ifg_carp_demoted;
+};
+
/*
* Used to lookup groups for an interface
*/
@@ -463,11 +468,13 @@ struct ifgroupreq {
char ifgr_name[IFNAMSIZ];
u_int ifgr_len;
union {
- char ifgru_group[IFNAMSIZ];
- struct ifg_req *ifgru_groups;
+ char ifgru_group[IFNAMSIZ];
+ struct ifg_req *ifgru_groups;
+ struct ifg_attrib ifgru_attrib;
} ifgr_ifgru;
#define ifgr_group ifgr_ifgru.ifgru_group
#define ifgr_groups ifgr_ifgru.ifgru_groups
+#define ifgr_attrib ifgr_ifgru.ifgru_attrib
};
/*
diff --git a/sys/net/if_pfsync.c b/sys/net/if_pfsync.c
index 9f43fc4be85..5d9604540e5 100644
--- a/sys/net/if_pfsync.c
+++ b/sys/net/if_pfsync.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_pfsync.c,v 1.65 2006/05/28 02:04:15 mcbride Exp $ */
+/* $OpenBSD: if_pfsync.c,v 1.66 2006/06/02 19:53:12 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff
@@ -59,7 +59,7 @@
#include "carp.h"
#if NCARP > 0
-extern int carp_suppress_preempt;
+#include <netinet/ip_carp.h>
#endif
#include <net/pfvar.h>
@@ -143,6 +143,10 @@ pfsyncattach(int npfsync)
if_attach(ifp);
if_alloc_sadl(ifp);
+#if NCARP > 0
+ if_addgroup(ifp, "carp");
+#endif
+
#if NBPFILTER > 0
bpfattach(&pfsyncif.sc_if.if_bpf, ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
#endif
@@ -757,7 +761,7 @@ pfsync_input(struct mbuf *m, ...)
timeout_del(&sc->sc_bulkfail_tmo);
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
#endif
pfsync_sync_ok = 1;
if (pf_status.debug >= PF_DEBUG_MISC)
@@ -922,7 +926,7 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_ureq_sent = time_uptime;
#if NCARP > 0
if (pfsync_sync_ok)
- carp_suppress_preempt++;
+ carp_group_demote_adj(&sc->sc_if, 1);
#endif
pfsync_sync_ok = 0;
if (pf_status.debug >= PF_DEBUG_MISC)
@@ -1424,7 +1428,7 @@ pfsync_bulkfail(void *v)
sc->sc_bulk_tries = 0;
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
#endif
pfsync_sync_ok = 1;
if (pf_status.debug >= PF_DEBUG_MISC)
diff --git a/sys/netinet/ip_carp.c b/sys/netinet/ip_carp.c
index 9d392445a89..91949c77db5 100644
--- a/sys/netinet/ip_carp.c
+++ b/sys/netinet/ip_carp.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip_carp.c,v 1.125 2006/05/22 23:25:15 krw Exp $ */
+/* $OpenBSD: ip_carp.c,v 1.126 2006/06/02 19:53:12 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -145,7 +145,6 @@ struct carp_softc {
LIST_HEAD(__carp_mchead, carp_mc_entry) carp_mc_listhead;
};
-int carp_suppress_preempt = 0;
int carp_opts[CARPCTL_MAXID] = { 0, 1, 0, 0, 0 }; /* XXX for now */
struct carpstats carpstats;
@@ -183,6 +182,7 @@ void carp_send_ad(void *);
void carp_send_arp(struct carp_softc *);
void carp_master_down(void *);
int carp_ioctl(struct ifnet *, u_long, caddr_t);
+void carp_ifgroup_ioctl(struct ifnet *, u_long, caddr_t);
void carp_start(struct ifnet *);
void carp_setrun(struct carp_softc *, sa_family_t);
void carp_set_state(struct carp_softc *, int);
@@ -206,6 +206,7 @@ int carp_clone_destroy(struct ifnet *);
int carp_ether_addmulti(struct carp_softc *, struct ifreq *);
int carp_ether_delmulti(struct carp_softc *, struct ifreq *);
void carp_ether_purgemulti(struct carp_softc *);
+int carp_group_demote_count(struct carp_softc *);
struct if_clone carp_cloner =
IF_CLONE_INITIALIZER("carp", carp_clone_create, carp_clone_destroy);
@@ -664,7 +665,7 @@ carp_proto_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af)
sc_tv.tv_sec = sc->sc_advbase;
- if (carp_suppress_preempt && sc->sc_advskew < 240)
+ if (carp_group_demote_count(sc) && sc->sc_advskew < 240)
sc_tv.tv_usec = 240 * 1000000 / 256;
else
sc_tv.tv_usec = sc->sc_advskew * 1000000 / 256;
@@ -680,7 +681,9 @@ carp_proto_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af)
* be more frequent than us, go into BACKUP state.
*/
if (timercmp(&sc_tv, &ch_tv, >) ||
- timercmp(&sc_tv, &ch_tv, ==)) {
+ (timercmp(&sc_tv, &ch_tv, ==) &&
+ ch->carp_demote <=
+ (carp_group_demote_count(sc) & 0xff))) {
timeout_del(&sc->sc_ad_tmo);
carp_set_state(sc, BACKUP);
carp_setrun(sc, 0);
@@ -698,6 +701,15 @@ carp_proto_input_c(struct mbuf *m, struct carp_header *ch, sa_family_t af)
}
/*
+ * Take over masters advertising with a higher demote count,
+ * regardless of CARPCTL_PREEMPT.
+ */
+ if (ch->carp_demote > (carp_group_demote_count(sc) & 0xff)) {
+ carp_master_down(sc);
+ break;
+ }
+
+ /*
* If the master is going to advertise at such a low frequency
* that he's guaranteed to time out, we'd might as well just
* treat him as timed out now.
@@ -821,11 +833,11 @@ carpdetach(struct carp_softc *sc)
timeout_del(&sc->sc_md6_tmo);
if (sc->sc_suppress)
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
sc->sc_suppress = 0;
if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS)
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
sc->sc_sendad_errors = 0;
carp_set_state(sc, INIT);
@@ -929,7 +941,7 @@ carp_send_ad(void *v)
advskew = 255;
} else {
advbase = sc->sc_advbase;
- if (!carp_suppress_preempt || sc->sc_advskew > 240)
+ if (!carp_group_demote_count(sc) || sc->sc_advskew > 240)
advskew = sc->sc_advskew;
else
advskew = 240;
@@ -940,10 +952,10 @@ carp_send_ad(void *v)
ch.carp_version = CARP_VERSION;
ch.carp_type = CARP_ADVERTISEMENT;
ch.carp_vhid = sc->sc_vhid;
+ ch.carp_demote = carp_group_demote_count(sc) & 0xff;
ch.carp_advbase = advbase;
ch.carp_advskew = advskew;
ch.carp_authlen = 7; /* XXX DEFINE */
- ch.carp_pad1 = 0; /* must be zero */
ch.carp_cksum = 0;
@@ -1009,17 +1021,14 @@ carp_send_ad(void *v)
sc->sc_if.if_oerrors++;
if (sc->sc_sendad_errors < INT_MAX)
sc->sc_sendad_errors++;
- if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS) {
- carp_suppress_preempt++;
- if (carp_suppress_preempt == 1)
- carp_send_ad_all();
- }
+ if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS)
+ carp_group_demote_adj(&sc->sc_if, 1);
sc->sc_sendad_success = 0;
} else {
if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS) {
if (++sc->sc_sendad_success >=
CARP_SENDAD_MIN_SUCCESS) {
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
sc->sc_sendad_errors = 0;
}
} else
@@ -1088,17 +1097,14 @@ carp_send_ad(void *v)
sc->sc_if.if_oerrors++;
if (sc->sc_sendad_errors < INT_MAX)
sc->sc_sendad_errors++;
- if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS) {
- carp_suppress_preempt++;
- if (carp_suppress_preempt == 1)
- carp_send_ad_all();
- }
+ if (sc->sc_sendad_errors == CARP_SENDAD_MAX_ERRORS)
+ carp_group_demote_adj(&sc->sc_if, 1);
sc->sc_sendad_success = 0;
} else {
if (sc->sc_sendad_errors >= CARP_SENDAD_MAX_ERRORS) {
if (++sc->sc_sendad_success >=
CARP_SENDAD_MIN_SUCCESS) {
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
sc->sc_sendad_errors = 0;
}
} else
@@ -2016,7 +2022,11 @@ carp_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr)
case SIOCDELMULTI:
error = carp_ether_delmulti(sc, ifr);
break;
-
+ case SIOCAIFGROUP:
+ case SIOCDIFGROUP:
+ if (sc->sc_suppress)
+ carp_ifgroup_ioctl(ifp, cmd, addr);
+ break;
default:
error = EINVAL;
}
@@ -2025,6 +2035,23 @@ carp_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr)
return (error);
}
+void
+carp_ifgroup_ioctl(struct ifnet *ifp, u_long cmd, caddr_t addr)
+{
+ struct ifgroupreq *ifgr = (struct ifgroupreq *)addr;
+ struct ifg_list *ifgl;
+
+ if (!strcmp(ifgr->ifgr_group, IFG_ALL))
+ return;
+ 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--;
+ }
+}
/*
* Start output on carp interface. This function should never be called.
@@ -2073,6 +2100,42 @@ carp_set_state(struct carp_softc *sc, int state)
}
void
+carp_group_demote_adj(struct ifnet *ifp, int adj)
+{
+ struct ifg_list *ifgl;
+ int *dm;
+ struct carp_softc *nil = NULL;
+
+ TAILQ_FOREACH(ifgl, &ifp->if_groups, ifgl_next) {
+ if (!strcmp(ifgl->ifgl_group->ifg_group, IFG_ALL))
+ continue;
+ dm = &ifgl->ifgl_group->ifg_carp_demoted;
+
+ if (*dm + adj >= 0)
+ *dm += adj;
+ else
+ *dm = 0;
+
+ if (adj > 0 && *dm == 1)
+ carp_send_ad_all();
+ CARP_LOG(nil, ("%s demoted group %s to %d", ifp->if_xname,
+ ifgl->ifgl_group->ifg_group, *dm));
+ }
+}
+
+int
+carp_group_demote_count(struct carp_softc *sc)
+{
+ struct ifg_list *ifgl;
+ int count = 0;
+
+ TAILQ_FOREACH(ifgl, &sc->sc_if.if_groups, ifgl_next)
+ count += ifgl->ifgl_group->ifg_carp_demoted;
+
+ return (count);
+}
+
+void
carp_carpdev_state(void *v)
{
struct carp_if *cif;
@@ -2096,17 +2159,14 @@ carp_carpdev_state(void *v)
carp_set_state(sc, INIT);
sc->sc_suppress = 1;
carp_setrun(sc, 0);
- if (!suppressed) {
- carp_suppress_preempt++;
- if (carp_suppress_preempt == 1)
- carp_send_ad_all();
- }
+ if (!suppressed)
+ carp_group_demote_adj(&sc->sc_if, 1);
} else {
carp_set_state(sc, INIT);
sc->sc_suppress = 0;
carp_setrun(sc, 0);
if (suppressed)
- carp_suppress_preempt--;
+ carp_group_demote_adj(&sc->sc_if, -1);
}
}
}
diff --git a/sys/netinet/ip_carp.h b/sys/netinet/ip_carp.h
index 2ea0155941e..a2d966736bf 100644
--- a/sys/netinet/ip_carp.h
+++ b/sys/netinet/ip_carp.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip_carp.h,v 1.20 2006/04/27 02:19:32 tedu Exp $ */
+/* $OpenBSD: ip_carp.h,v 1.21 2006/06/02 19:53:12 mpf Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff. All rights reserved.
@@ -37,7 +37,7 @@
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |Version| Type | VirtualHostID | AdvSkew | Auth Len |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * | Reserved | AdvBase | Checksum |
+ * | Demotion | AdvBase | Checksum |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | Counter (1) |
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
@@ -68,7 +68,7 @@ struct carp_header {
u_int8_t carp_vhid; /* virtual host id */
u_int8_t carp_advskew; /* advertisement skew */
u_int8_t carp_authlen; /* size of counter+md, 32bit chunks */
- u_int8_t carp_pad1; /* reserved */
+ u_int8_t carp_demote; /* demotion indicator */
u_int8_t carp_advbase; /* advertisement interval */
u_int16_t carp_cksum;
u_int32_t carp_counter[2];
@@ -155,6 +155,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);
int carp6_proto_input(struct mbuf **, int *, int);
int carp_iamatch(struct in_ifaddr *, u_char *,
u_int32_t *, u_int32_t);
diff --git a/sys/sys/sockio.h b/sys/sys/sockio.h
index 5c27502914e..2023b24a0dd 100644
--- a/sys/sys/sockio.h
+++ b/sys/sys/sockio.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sockio.h,v 1.36 2006/01/05 14:57:24 norby Exp $ */
+/* $OpenBSD: sockio.h,v 1.37 2006/06/02 19:53:12 mpf Exp $ */
/* $NetBSD: sockio.h,v 1.5 1995/08/23 00:40:47 thorpej Exp $ */
/*-
@@ -145,6 +145,8 @@
#define SIOCGIFGROUP _IOWR('i', 136, struct ifgroupreq) /* get ifgroups */
#define SIOCDIFGROUP _IOW('i', 137, struct ifgroupreq) /* delete ifgroup */
#define SIOCGIFGMEMB _IOWR('i', 138, struct ifgroupreq) /* get members */
+#define SIOCGIFGATTR _IOWR('i', 139, struct ifgroupreq) /* get ifgroup attribs */
+#define SIOCSIFGATTR _IOW('i', 140, struct ifgroupreq) /* set ifgroup attribs */
#define SIOCSIFDESCR _IOW('i', 128, struct ifreq) /* set ifnet descr */
#define SIOCGIFDESCR _IOWR('i', 129, struct ifreq) /* get ifnet descr */