bin/100956: [patch] support setting carp device state with ifconfig

Nick Barkas snb at threerings.net
Fri Jul 28 02:10:16 UTC 2006


>Number:         100956
>Category:       bin
>Synopsis:       [patch] support setting carp device state with ifconfig
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jul 28 02:10:13 GMT 2006
>Closed-Date:
>Last-Modified:
>Originator:     Nick Barkas
>Release:        FreeBSD 7.0-CURRENT i386
>Organization:
>Environment:
FreeBSD freebsd-current.sea.earth.threerings.net 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Thu Jul 27 13:01:44 PDT 2006   root at freebsd61.sea.earth.threerings.net:/usr/obj/usr/src/sys/TEST  i386
>Description:
	carp(4) devices expose an ioctl allowing their states to be set to MASTER or
    BACKUP explicitly from userland. However, ifconfig does not have any option
    to do this. Attached is a patch based on OpenBSD's ifconfig which allows a
    state option to be given to carp interfaces, and a patch to the ifconfig man
    page.
>How-To-Repeat:
	ifconfig carpN state foo does not currently work.
>Fix:
--- src/sbin/ifconfig/ifcarp.c.orig	Tue Feb 22 06:07:47 2005
+++ src/sbin/ifconfig/ifcarp.c	Thu Jul 27 16:15:12 2006
@@ -57,6 +57,7 @@
 void setcarp_advskew(const char *, int, int, const struct afswtch *rafp);
 void setcarp_passwd(const char *, int, int, const struct afswtch *rafp);
 void setcarp_vhid(const char *, int, int, const struct afswtch *rafp);
+void setcarp_state(const char *, int, int, const struct afswtch *rafp);
 
 void
 carp_status(int s)
@@ -174,11 +175,34 @@
 	return;
 }
 
+void setcarp_state(const char *val, int d, int s, const struct afswtch *afp)
+{
+	struct carpreq carpr;
+	int i;
+
+	bzero((char *)&carpr, sizeof(struct carpreq));
+	ifr.ifr_data = (caddr_t)&carpr;
+
+	if (ioctl(s, SIOCGVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCGVH");
+
+	for (i = 0; i <= CARP_MAXSTATE; i++) {
+		if (!strcasecmp(val, carp_states[i])) {
+			carpr.carpr_state = i;
+			break;
+		}
+	}
+
+	if (ioctl(s, SIOCSVH, (caddr_t)&ifr) == -1)
+		err(1, "SIOCSVH");
+}
+
 static struct cmd carp_cmds[] = {
 	DEF_CMD_ARG("advbase",	setcarp_advbase),
 	DEF_CMD_ARG("advskew",	setcarp_advskew),
 	DEF_CMD_ARG("pass",	setcarp_passwd),
 	DEF_CMD_ARG("vhid",	setcarp_vhid),
+	DEF_CMD_ARG("state",	setcarp_state),
 };
 static struct afswtch af_carp = {
 	.af_name	= "af_carp",


--- src/sbin/ifconfig/ifconfig.8.orig	Tue Jul 25 20:08:45 2006
+++ src/sbin/ifconfig/ifconfig.8	Thu Jul 27 19:02:50 2006
@@ -28,7 +28,7 @@
 .\"     From: @(#)ifconfig.8	8.3 (Berkeley) 1/5/94
 .\" $FreeBSD: /repoman/r/ncvs/src/sbin/ifconfig/ifconfig.8,v 1.119 2006/07/26 03:08:45 sam Exp $
 .\"
-.Dd July 25, 2006
+.Dd July 27, 2006
 .Dt IFCONFIG 8
 .Os
 .Sh NAME
@@ -1405,6 +1405,13 @@
 Set the virtual host ID.
 This is a required setting.
 Acceptable values are 1 to 255.
+.It Cm state Ar state
+Force the interface into state 
+.Ar state . 
+Valid states are INIT, BACKUP, and MASTER. Note that manually setting the state
+to INIT is ignored by 
+.Xr carp 4 .
+This state is set automatically when the underlying interface is down.
 .El
 .Pp
 The
>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list