summaryrefslogtreecommitdiff
path: root/usr/src/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd')
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c135
-rw-r--r--usr/src/cmd/netadm/iu.ap.sh2
-rw-r--r--usr/src/cmd/rcm_daemon/common/ip_rcm.c77
3 files changed, 114 insertions, 100 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
index 595b76248e..ed8ab462f5 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
+++ b/usr/src/cmd/cmd-inet/usr.sbin/ifconfig/ifconfig.c
@@ -182,8 +182,8 @@ static void usage(void);
static int strioctl(int s, int cmd, char *buf, int buflen);
static int setifdhcp(const char *caller, const char *ifname,
int argc, char *argv[]);
-static int ip_domux2fd(int *, int *, int *, int *);
-static int ip_plink(int, int, int, int);
+static int ip_domux2fd(int *, int *, int *, int *, int *);
+static int ip_plink(int, int, int, int, int);
static int modop(char *arg, char op);
static int get_lun(char *);
static void selectifs(int argc, char *argv[], int af,
@@ -571,7 +571,7 @@ foreachinterface(void (*func)(), int argc, char *argv[], int af,
if (onflags || offflags) {
(void) memset(&lifrl, 0, sizeof (lifrl));
(void) strncpy(lifrl.lifr_name, lifrp->lifr_name,
- sizeof (lifrl.lifr_name));
+ sizeof (lifrl.lifr_name));
if (ioctl(s, SIOCGLIFFLAGS, (caddr_t)&lifrl) < 0) {
/*
* Perror0() assumes the name to be in the
@@ -1209,7 +1209,7 @@ static int
set_tun_esp_encr_alg(char *addr, int64_t param)
{
return (set_tun_algs(ESP_ENCR_ALG,
- parsealg(addr, IPSEC_PROTO_ESP)));
+ parsealg(addr, IPSEC_PROTO_ESP)));
}
/* ARGSUSED */
@@ -1217,7 +1217,7 @@ static int
set_tun_esp_auth_alg(char *addr, int64_t param)
{
return (set_tun_algs(ESP_AUTH_ALG,
- parsealg(addr, IPSEC_PROTO_AH)));
+ parsealg(addr, IPSEC_PROTO_AH)));
}
/* ARGSUSED */
@@ -1225,7 +1225,7 @@ static int
set_tun_ah_alg(char *addr, int64_t param)
{
return (set_tun_algs(AH_AUTH_ALG,
- parsealg(addr, IPSEC_PROTO_AH)));
+ parsealg(addr, IPSEC_PROTO_AH)));
}
/* ARGSUSED */
@@ -2224,6 +2224,7 @@ setifgroupname(char *grpname, int64_t param)
static int
modlist(char *null, int64_t param)
{
+ int muxid_fd;
int muxfd;
int ipfd_lowstr;
int arpfd_lowstr;
@@ -2233,7 +2234,7 @@ modlist(char *null, int64_t param)
int orig_arpid;
(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
- if (ip_domux2fd(&muxfd, &ipfd_lowstr, &arpfd_lowstr,
+ if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr,
&orig_arpid) < 0) {
return (-1);
}
@@ -2255,14 +2256,15 @@ modlist(char *null, int64_t param)
Perror0("cannot I_LIST for module names");
} else {
for (i = 0; i < strlist.sl_nmods; i++) {
- (void) printf("%d %s\n", i,
- strlist.sl_modlist[i].l_name);
+ (void) printf("%d %s\n", i,
+ strlist.sl_modlist[i].l_name);
}
}
free(strlist.sl_modlist);
}
}
- return (ip_plink(muxfd, ipfd_lowstr, arpfd_lowstr, orig_arpid));
+ return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr,
+ orig_arpid));
}
#define MODINSERT_OP 'i'
@@ -2291,27 +2293,26 @@ modremove(char *arg, int64_t param)
}
/*
- * Open a stream on /dev/udp, pop off all undesired modules (note that
- * the user may have configured autopush to add modules above or below
- * udp), and push the arp module onto raw IP.
+ * Open a stream on /dev/udp{,6}, pop off all undesired modules (note that
+ * the user may have configured autopush to add modules above
+ * udp), and push the arp module onto the resulting stream.
+ * This is used to make IP+ARP be able to atomically track the muxid
+ * for the I_PLINKed STREAMS, thus it isn't related to ARP running the ARP
+ * protocol.
*/
static int
open_arp_on_udp(char *udp_dev_name)
{
int fd;
- boolean_t popped;
if ((fd = open(udp_dev_name, O_RDWR)) == -1) {
Perror2("open", udp_dev_name);
return (-1);
}
errno = 0;
- popped = _B_FALSE;
while (ioctl(fd, I_POP, 0) != -1)
- popped = _B_TRUE;
- if (!popped) {
- Perror2("cannot pop", udp_dev_name);
- } else if (errno != EINVAL) {
+ ;
+ if (errno != EINVAL) {
Perror2("pop", udp_dev_name);
} else if (ioctl(fd, I_PUSH, ARP_MOD_NAME) == -1) {
Perror2("arp PUSH", udp_dev_name);
@@ -2328,8 +2329,10 @@ open_arp_on_udp(char *udp_dev_name)
* global variable lifr.
*
* Param:
- * int *udp_fd: (referenced) fd to /dev/udp (upper IP stream).
- * int *fd: (referenced) fd to the lower IP stream.
+ * int *muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK
+ * int *muxid_fd: fd to /dev/udp{,6} for LIFMUXID
+ * int *ipfd_lowstr: fd to the lower IP stream.
+ * int *arpfd_lowstr: fd to the lower ARP stream.
*
* Return:
* -1 if operation fails, 0 otherwise.
@@ -2338,12 +2341,11 @@ open_arp_on_udp(char *udp_dev_name)
* for the logic of the PLINK/PUNLINK
*/
static int
-ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
+ip_domux2fd(int *muxfd, int *muxid_fd, int *ipfd_lowstr, int *arpfd_lowstr,
+ int *orig_arpid)
{
- int ip_fd;
uint64_t flags;
char *udp_dev_name;
- char *ip_dev_name;
*orig_arpid = 0;
(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
@@ -2353,20 +2355,18 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
flags = lifr.lifr_flags;
if (flags & IFF_IPV4) {
udp_dev_name = UDP_DEV_NAME;
- ip_dev_name = IP_DEV_NAME;
} else if (flags & IFF_IPV6) {
udp_dev_name = UDP6_DEV_NAME;
- ip_dev_name = IP6_DEV_NAME;
} else {
return (-1);
}
- if ((ip_fd = open(ip_dev_name, O_RDWR)) < 0) {
- Perror2("open", ip_dev_name);
+ if ((*muxid_fd = open(udp_dev_name, O_RDWR)) < 0) {
+ Perror2("open", udp_dev_name);
return (-1);
}
- if (ioctl(ip_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
- Perror2("SIOCGLIFMUXID", ip_dev_name);
+ if (ioctl(*muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
+ Perror2("SIOCGLIFMUXID", udp_dev_name);
return (-1);
}
if (debug > 0) {
@@ -2374,6 +2374,9 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
lifr.lifr_arp_muxid, lifr.lifr_ip_muxid);
}
+ /*
+ * Use /dev/udp{,6} as the mux to avoid linkcycles.
+ */
if ((*muxfd = open_arp_on_udp(udp_dev_name)) == -1)
return (-1);
@@ -2393,7 +2396,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
*/
*orig_arpid = lifr.lifr_arp_muxid;
lifr.lifr_arp_muxid = 0;
- (void) ioctl(*muxfd, SIOCSLIFMUXID,
+ (void) ioctl(*muxid_fd, SIOCSLIFMUXID,
(caddr_t)&lifr);
*arpfd_lowstr = -1;
} else {
@@ -2415,7 +2418,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
/* Undo any changes we made */
if (*orig_arpid != 0) {
lifr.lifr_arp_muxid = *orig_arpid;
- (void) ioctl(*muxfd, SIOCSLIFMUXID, (caddr_t)&lifr);
+ (void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
}
return (-1);
}
@@ -2424,7 +2427,7 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
/* Undo any changes we made */
if (*orig_arpid != 0) {
lifr.lifr_arp_muxid = *orig_arpid;
- (void) ioctl(*muxfd, SIOCSLIFMUXID, (caddr_t)&lifr);
+ (void) ioctl(*muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
}
return (-1);
}
@@ -2439,8 +2442,10 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
* must be called in pairs.
*
* Param:
- * int udp_fd: fd to /dev/udp (upper IP stream).
- * int fd: fd to the lower IP stream.
+ * int muxfd: fd to /dev/udp{,6} for I_PLINK/I_PUNLINK
+ * int muxid_fd: fd to /dev/udp{,6} for LIFMUXID
+ * int ipfd_lowstr: fd to the lower IP stream.
+ * int arpfd_lowstr: fd to the lower ARP stream.
*
* Return:
* -1 if operation fails, 0 otherwise.
@@ -2449,7 +2454,8 @@ ip_domux2fd(int *muxfd, int *ipfd_lowstr, int *arpfd_lowstr, int *orig_arpid)
* for the logic of the PLINK/PUNLINK
*/
static int
-ip_plink(int muxfd, int ipfd_lowstr, int arpfd_lowstr, int orig_arpid)
+ip_plink(int muxfd, int muxid_fd, int ipfd_lowstr, int arpfd_lowstr,
+ int orig_arpid)
{
int ip_muxid;
@@ -2474,9 +2480,11 @@ ip_plink(int muxfd, int ipfd_lowstr, int arpfd_lowstr, int orig_arpid)
/* Undo the changes we did in ip_domux2fd */
lifr.lifr_arp_muxid = orig_arpid;
lifr.lifr_ip_muxid = ip_muxid;
- (void) ioctl(muxfd, SIOCSLIFMUXID, (caddr_t)&lifr);
+ (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
}
+ (void) close(muxfd);
+ (void) close(muxid_fd);
return (0);
}
@@ -2497,6 +2505,7 @@ modop(char *arg, char op)
{
char *pos_p;
int muxfd;
+ int muxid_fd;
int ipfd_lowstr; /* IP stream (lower stream of mux) to be plinked */
int arpfd_lowstr; /* ARP stream (lower stream of mux) to be plinked */
struct strmodconf mod;
@@ -2551,7 +2560,7 @@ modop(char *arg, char op)
}
mod.pos = atoi(pos_p);
- if (ip_domux2fd(&muxfd, &ipfd_lowstr, &arpfd_lowstr,
+ if (ip_domux2fd(&muxfd, &muxid_fd, &ipfd_lowstr, &arpfd_lowstr,
&orig_arpid) < 0) {
free(arg_str);
return (-1);
@@ -2581,7 +2590,8 @@ modop(char *arg, char op)
break;
}
free(arg_str);
- return (ip_plink(muxfd, ipfd_lowstr, arpfd_lowstr, orig_arpid));
+ return (ip_plink(muxfd, muxid_fd, ipfd_lowstr, arpfd_lowstr,
+ orig_arpid));
}
/*
@@ -3101,7 +3111,7 @@ configinfo(char *null, int64_t param)
(void) printf(" metric %d ", lifr.lifr_metric);
}
if (((flags & (IFF_VIRTUAL|IFF_LOOPBACK)) != IFF_VIRTUAL) &&
- ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0)
+ ioctl(s, SIOCGLIFMTU, (caddr_t)&lifr) >= 0)
(void) printf(" mtu %d", lifr.lifr_metric);
/* don't print index when in compatibility mode */
@@ -3259,7 +3269,7 @@ tun_status(void)
if ((protocol == AF_INET6) &&
(icfg_get_tunnel_encaplimit(handle, &encaplimit) ==
- ICFG_SUCCESS)) {
+ ICFG_SUCCESS)) {
if (!tabbed) {
(void) printf("\t");
tabbed = _B_TRUE;
@@ -3350,7 +3360,7 @@ in_status(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_status: SIOCGLIFDSTADDR");
+ Perror0_exit("in_status: SIOCGLIFDSTADDR");
}
sin = (struct sockaddr_in *)&lifr.lifr_dstaddr;
(void) printf("--> %s ", inet_ntoa(sin->sin_addr));
@@ -3363,7 +3373,7 @@ in_status(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_status: SIOCGLIFBRDADDR");
+ Perror0_exit("in_status: SIOCGLIFBRDADDR");
}
sin = (struct sockaddr_in *)&lifr.lifr_addr;
if (sin->sin_addr.s_addr != 0) {
@@ -3450,7 +3460,7 @@ in6_status(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_status6: SIOCGLIFDSTADDR");
+ Perror0_exit("in_status6: SIOCGLIFDSTADDR");
}
sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr;
(void) printf("--> %s ",
@@ -3466,7 +3476,7 @@ in6_status(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_status6: SIOCGLIFTOKEN");
+ Perror0_exit("in_status6: SIOCGLIFTOKEN");
} else {
sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
(void) printf("token %s/%d ",
@@ -3569,7 +3579,7 @@ in_configinfo(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_configinfo: SIOCGLIFDSTADDR");
+ Perror0_exit("in_configinfo: SIOCGLIFDSTADDR");
}
sin = (struct sockaddr_in *)&lifr.lifr_dstaddr;
(void) printf(" destination %s ", inet_ntoa(sin->sin_addr));
@@ -3582,7 +3592,7 @@ in_configinfo(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in_configinfo: SIOCGLIFBRDADDR");
+ Perror0_exit("in_configinfo: SIOCGLIFBRDADDR");
}
sin = (struct sockaddr_in *)&lifr.lifr_addr;
if (sin->sin_addr.s_addr != 0) {
@@ -3678,7 +3688,7 @@ in6_configinfo(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in6_configinfo: SIOCGLIFDSTADDR");
+ Perror0_exit("in6_configinfo: SIOCGLIFDSTADDR");
}
sin6 = (struct sockaddr_in6 *)&lifr.lifr_dstaddr;
(void) printf(" destination %s ",
@@ -3692,7 +3702,7 @@ in6_configinfo(int force, uint64_t flags)
(void) memset(&lifr.lifr_addr, 0,
sizeof (lifr.lifr_addr));
else
- Perror0_exit("in6_configinfo: SIOCGLIFTOKEN");
+ Perror0_exit("in6_configinfo: SIOCGLIFTOKEN");
} else {
sin6 = (struct sockaddr_in6 *)&lifr.lifr_addr;
(void) printf(" token %s/%d ",
@@ -3761,10 +3771,10 @@ get_lun(char *rsrc)
* and IP uses the info in the I_PLINK message to get the muxid.
*
* a. STREAMS does not allow us to use /dev/ip itself as the mux. So we use
- * /dev/udp[6].
+ * /dev/udp{,6}.
* b. SIOCGLIFMUXID returns the muxid corresponding to the V4 or V6 stream
* depending on the open i.e. V4 vs V6 open. So we need to use /dev/udp
- * or /dev/udp6.
+ * or /dev/udp6 for SIOCGLIFMUXID and SIOCSLIFMUXID.
* c. We need to push ARP in order to get the required kernel support for
* atomic plumbings. The actual work done by ARP is explained in arp.c
* Without pushing ARP, we will still be able to plumb/unplumb. But
@@ -3963,6 +3973,7 @@ inetunplumb(char *arg, int64_t param)
{
int ip_muxid, arp_muxid;
int mux_fd;
+ int muxid_fd;
char *udp_dev_name;
char *strptr;
uint64_t flags;
@@ -3994,15 +4005,18 @@ inetunplumb(char *arg, int64_t param)
else
udp_dev_name = UDP_DEV_NAME;
+ if ((muxid_fd = open(udp_dev_name, O_RDWR)) == -1)
+ exit(EXIT_FAILURE);
+
if ((mux_fd = open_arp_on_udp(udp_dev_name)) == -1)
exit(EXIT_FAILURE);
(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
- if (ioctl(mux_fd, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
+ if (ioctl(muxid_fd, SIOCGLIFFLAGS, (caddr_t)&lifr) < 0) {
Perror0_exit("unplumb: SIOCGLIFFLAGS");
}
flags = lifr.lifr_flags;
- if (ioctl(mux_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
+ if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)&lifr) < 0) {
Perror0_exit("unplumb: SIOCGLIFMUXID");
}
arp_muxid = lifr.lifr_arp_muxid;
@@ -4028,7 +4042,7 @@ inetunplumb(char *arg, int64_t param)
* for consistency of IP-ARP streams.
*/
lifr.lifr_arp_muxid = 0;
- (void) ioctl(mux_fd, SIOCSLIFMUXID,
+ (void) ioctl(muxid_fd, SIOCSLIFMUXID,
(caddr_t)&lifr);
changed_arp_muxid = _B_TRUE;
} else {
@@ -4048,12 +4062,13 @@ inetunplumb(char *arg, int64_t param)
save_errno = errno;
lifr.lifr_arp_muxid = arp_muxid;
lifr.lifr_ip_muxid = ip_muxid;
- (void) ioctl(mux_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
+ (void) ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)&lifr);
errno = save_errno;
}
Perror0_exit("I_PUNLINK for ip");
}
(void) close(mux_fd);
+ (void) close(muxid_fd);
return (0);
}
@@ -4146,17 +4161,17 @@ Perror0(char *cmd)
case ENXIO:
(void) fprintf(stderr, "%s: %s: no such interface\n",
- cmd, lifr.lifr_name);
+ cmd, lifr.lifr_name);
break;
case EPERM:
(void) fprintf(stderr, "%s: %s: permission denied\n",
- cmd, lifr.lifr_name);
+ cmd, lifr.lifr_name);
break;
case EEXIST:
(void) fprintf(stderr, "%s: %s: already exists\n",
- cmd, lifr.lifr_name);
+ cmd, lifr.lifr_name);
break;
default: {
@@ -4189,12 +4204,12 @@ Perror2(char *cmd, char *str)
case ENXIO:
(void) fprintf(stderr, "%s: %s: no such interface\n",
- cmd, str);
+ cmd, str);
break;
case EPERM:
(void) fprintf(stderr, "%s: %s: permission denied\n",
- cmd, str);
+ cmd, str);
break;
default: {
diff --git a/usr/src/cmd/netadm/iu.ap.sh b/usr/src/cmd/netadm/iu.ap.sh
index cf7d61c15d..abf930cade 100644
--- a/usr/src/cmd/netadm/iu.ap.sh
+++ b/usr/src/cmd/netadm/iu.ap.sh
@@ -43,7 +43,6 @@ case "$MACH" in
usbser_edge -1 0 ldterm ttcompat
usbsprl -1 0 ldterm ttcompat
usbsksp -1 0 ldterm ttcompat
- rts -1 0 rts [anchor]
ipsecesp -1 0 ipsecesp
ipsecah -1 0 ipsecah
" > iu.ap
@@ -73,7 +72,6 @@ case "$MACH" in
usbsacm -1 0 ldterm ttcompat
usbsprl -1 0 ldterm ttcompat
usbsksp -1 0 ldterm ttcompat
- rts -1 0 rts [anchor]
ttymux -1 0 ldterm ttcompat
ipsecesp -1 0 ipsecesp
ipsecah -1 0 ipsecah
diff --git a/usr/src/cmd/rcm_daemon/common/ip_rcm.c b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
index 684df3130c..f4a896e41a 100644
--- a/usr/src/cmd/rcm_daemon/common/ip_rcm.c
+++ b/usr/src/cmd/rcm_daemon/common/ip_rcm.c
@@ -283,8 +283,8 @@ static int mpathd_send_cmd(mpathd_cmd_t *);
static int connect_to_mpathd(int);
static int modop(char *, char *, int, char);
static int get_modlist(char *, ip_lif_t *);
-static int ip_domux2fd(int *, int *, struct lifreq *);
-static int ip_plink(int, int, struct lifreq *);
+static int ip_domux2fd(int *, int *, int *, struct lifreq *);
+static int ip_plink(int, int, int, struct lifreq *);
static int ip_onlinelist(rcm_handle_t *, ip_cache_t *, char **, uint_t,
rcm_info_t **);
static int ip_offlinelist(rcm_handle_t *, ip_cache_t *, char **, uint_t,
@@ -2287,7 +2287,8 @@ modop(char *name, char *arg, int pos, char op)
static int
get_modlist(char *name, ip_lif_t *lif)
{
- int udp_fd;
+ int mux_fd;
+ int muxid_fd;
int fd;
int i;
int num_mods;
@@ -2298,7 +2299,7 @@ get_modlist(char *name, ip_lif_t *lif)
(void) strncpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
lifr.lifr_flags = lif->li_ifflags;
- if (ip_domux2fd(&udp_fd, &fd, &lifr) < 0) {
+ if (ip_domux2fd(&mux_fd, &muxid_fd, &fd, &lifr) < 0) {
rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd(%s)\n"), name);
return (-1);
}
@@ -2307,7 +2308,7 @@ get_modlist(char *name, ip_lif_t *lif)
rcm_log_message(RCM_ERROR,
_("IP: get_modlist(%s): I_LIST(%s) \n"),
name, strerror(errno));
- (void) ip_plink(udp_fd, fd, &lifr);
+ (void) ip_plink(mux_fd, muxid_fd, fd, &lifr);
return (-1);
}
@@ -2317,7 +2318,7 @@ get_modlist(char *name, ip_lif_t *lif)
if (strlist.sl_modlist == NULL) {
rcm_log_message(RCM_ERROR, _("IP: get_modlist(%s): %s\n"),
name, strerror(errno));
- (void) ip_plink(udp_fd, fd, &lifr);
+ (void) ip_plink(mux_fd, muxid_fd, fd, &lifr);
return (-1);
}
@@ -2325,7 +2326,7 @@ get_modlist(char *name, ip_lif_t *lif)
rcm_log_message(RCM_ERROR,
_("IP: get_modlist(%s): I_LIST error: %s\n"),
name, strerror(errno));
- (void) ip_plink(udp_fd, fd, &lifr);
+ (void) ip_plink(mux_fd, muxid_fd, fd, &lifr);
return (-1);
}
@@ -2336,7 +2337,7 @@ get_modlist(char *name, ip_lif_t *lif)
rcm_log_message(RCM_ERROR,
_("IP: get_modlist(%s): %s\n"),
name, strerror(errno));
- (void) ip_plink(udp_fd, fd, &lifr);
+ (void) ip_plink(mux_fd, muxid_fd, fd, &lifr);
return (-1);
}
(void) strcpy(lif->li_modules[i], strlist.sl_modlist[i].l_name);
@@ -2346,7 +2347,7 @@ get_modlist(char *name, ip_lif_t *lif)
free(strlist.sl_modlist);
rcm_log_message(RCM_TRACE1, "IP: getmodlist(%s) success\n", name);
- return (ip_plink(udp_fd, fd, &lifr));
+ return (ip_plink(mux_fd, muxid_fd, fd, &lifr));
}
/*
@@ -2354,37 +2355,34 @@ get_modlist(char *name, ip_lif_t *lif)
* Stolen from ifconfig.c
*/
static int
-ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr)
+ip_domux2fd(int *mux_fd, int *muxid_fdp, int *fd, struct lifreq *lifr)
{
- int ip_fd;
+ int muxid_fd;
char *udp_dev_name;
- char *ip_dev_name;
if (lifr->lifr_flags & IFF_IPV6) {
- udp_dev_name = UDP6_DEV_NAME;
- ip_dev_name = IP6_DEV_NAME;
+ udp_dev_name = UDP6_DEV_NAME;
} else {
- udp_dev_name = UDP_DEV_NAME;
- ip_dev_name = IP_DEV_NAME;
+ udp_dev_name = UDP_DEV_NAME;
}
- if ((ip_fd = open(ip_dev_name, O_RDWR)) < 0) {
+ if ((muxid_fd = open(udp_dev_name, O_RDWR)) < 0) {
rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: open(%s) %s\n"),
- ip_dev_name, strerror(errno));
+ udp_dev_name, strerror(errno));
return (-1);
}
- if ((*udp_fd = open(udp_dev_name, O_RDWR)) < 0) {
+ if ((*mux_fd = open(udp_dev_name, O_RDWR)) < 0) {
rcm_log_message(RCM_ERROR, _("IP: ip_domux2fd: open(%s) %s\n"),
udp_dev_name, strerror(errno));
- (void) close(ip_fd);
+ (void) close(muxid_fd);
return (-1);
}
- if (ioctl(ip_fd, SIOCGLIFMUXID, (caddr_t)lifr) < 0) {
+ if (ioctl(muxid_fd, SIOCGLIFMUXID, (caddr_t)lifr) < 0) {
rcm_log_message(RCM_ERROR,
_("IP: ip_domux2fd: SIOCGLIFMUXID(%s): %s\n"),
- ip_dev_name, strerror(errno));
- (void) close(*udp_fd);
- (void) close(ip_fd);
+ udp_dev_name, strerror(errno));
+ (void) close(*mux_fd);
+ (void) close(muxid_fd);
return (-1);
}
@@ -2392,25 +2390,25 @@ ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr)
"IP: ip_domux2fd: ARP_muxid %d IP_muxid %d\n",
lifr->lifr_arp_muxid, lifr->lifr_ip_muxid);
- if ((*fd = ioctl(*udp_fd, _I_MUXID2FD, lifr->lifr_ip_muxid)) < 0) {
+ if ((*fd = ioctl(*mux_fd, _I_MUXID2FD, lifr->lifr_ip_muxid)) < 0) {
rcm_log_message(RCM_ERROR,
_("IP: ip_domux2fd: _I_MUXID2FD(%s): %s\n"),
udp_dev_name, strerror(errno));
- (void) close(*udp_fd);
- (void) close(ip_fd);
+ (void) close(*mux_fd);
+ (void) close(muxid_fd);
return (-1);
}
- if (ioctl(*udp_fd, I_PUNLINK, lifr->lifr_ip_muxid) < 0) {
+ if (ioctl(*mux_fd, I_PUNLINK, lifr->lifr_ip_muxid) < 0) {
rcm_log_message(RCM_ERROR,
_("IP: ip_domux2fd: I_PUNLINK(%s): %s\n"),
udp_dev_name, strerror(errno));
- (void) close(*udp_fd);
- (void) close(ip_fd);
+ (void) close(*mux_fd);
+ (void) close(muxid_fd);
return (-1);
}
- /* Note: udp_fd is closed in ip_plink below */
- (void) close(ip_fd);
+ /* Note: mux_fd and muxid_fd are closed in ip_plink below */
+ *muxid_fdp = muxid_fd;
return (0);
}
@@ -2419,29 +2417,32 @@ ip_domux2fd(int *udp_fd, int *fd, struct lifreq *lifr)
* Stolen from ifconfig.c
*/
static int
-ip_plink(int udp_fd, int fd, struct lifreq *lifr)
+ip_plink(int mux_fd, int muxid_fd, int fd, struct lifreq *lifr)
{
int mux_id;
- if ((mux_id = ioctl(udp_fd, I_PLINK, fd)) < 0) {
+ if ((mux_id = ioctl(mux_fd, I_PLINK, fd)) < 0) {
rcm_log_message(RCM_ERROR, _("IP: ip_plink I_PLINK(%s): %s\n"),
UDP_DEV_NAME, strerror(errno));
- (void) close(udp_fd);
+ (void) close(mux_fd);
+ (void) close(muxid_fd);
(void) close(fd);
return (-1);
}
lifr->lifr_ip_muxid = mux_id;
- if (ioctl(udp_fd, SIOCSLIFMUXID, (caddr_t)lifr) < 0) {
+ if (ioctl(muxid_fd, SIOCSLIFMUXID, (caddr_t)lifr) < 0) {
rcm_log_message(RCM_ERROR,
_("IP: ip_plink SIOCSLIFMUXID(%s): %s\n"),
UDP_DEV_NAME, strerror(errno));
- (void) close(udp_fd);
+ (void) close(mux_fd);
+ (void) close(muxid_fd);
(void) close(fd);
return (-1);
}
- (void) close(udp_fd);
+ (void) close(mux_fd);
+ (void) close(muxid_fd);
(void) close(fd);
return (0);
}