ip_rcm.c revision fc80c0dfb0c877aee828d778ea32b77fcf7b1ef4
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A#include <libdevinfo.h>
2N/A#include <libinetutil.h>
2N/A#include <ipmp_mpathd.h>
2N/A#include "rcm_module.h"
2N/Atypedef struct mpathd_cmd {
2N/Atypedef struct mpathd_unoffline {
2N/Atypedef struct mpathd_response {
2N/Astatic int events_registered = 0;
2N/Astruct net_interface {
2N/Astruct devfs_minor_data {
2N/A char *minor_name;
2N/A char *minor_node_type;
2N/A char **, rcm_info_t **);
2N/A char **, rcm_info_t **);
2N/A char **, rcm_info_t **);
2N/A char **, rcm_info_t **);
2N/Astatic void free_cache();
2N/Astatic char *get_physical_resource(const char *);
2N/Astatic int connect_to_mpathd(int);
2N/A rcm_info_t **);
2N/A rcm_info_t **);
2N/Astatic void ip_free_addrlist(char **);
2N/A rcm_info_t **);
2N/Astatic int if_configure(char *);
2N/Astatic int if_ipmp_config(char *, int, int);
2N/Astatic int if_mpathd_configure(char *, char *, int, int);
2N/Astatic char *get_mpathd_dest(char *, int);
2N/Astatic int if_getcount(int);
2N/Astruct rcm_mod_ops *
2N/Arcm_mod_init(void)
2N/Arcm_mod_info(void)
2N/Arcm_mod_fini(void)
2N/A free_cache();
2N/A return (RCM_SUCCESS);
2N/A return (RCM_FAILURE);
2N/A if (!events_registered) {
2N/A != RCM_SUCCESS) {
2N/A return (RCM_FAILURE);
2N/A return (RCM_SUCCESS);
2N/A != RCM_SUCCESS) {
2N/A return (RCM_FAILURE);
if (events_registered) {
!= RCM_SUCCESS) {
return (RCM_FAILURE);
return (RCM_SUCCESS);
int detachable = 0;
int nofailover = 0;
int ipmp = 0;
return (RCM_SUCCESS);
detachable++;
ipmp++;
nofailover++;
RCM_SUCCESS) {
return (RCM_FAILURE);
return (RCM_FAILURE);
rsrc);
return (RCM_SUCCESS);
return (RCM_SUCCESS);
if (!ipmp) {
return (RCM_FAILURE);
return (RCM_SUCCESS);
if (!detachable) {
return (RCM_FAILURE);
return (RCM_FAILURE);
return (RCM_FAILURE);
return (RCM_SUCCESS);
return (RCM_FAILURE);
return (RCM_SUCCESS);
return (RCM_FAILURE);
return (RCM_FAILURE);
return (RCM_SUCCESS);
char *infostr;
if (!node) {
return (RCM_FAILURE);
return (RCM_FAILURE);
return (RCM_SUCCESS);
return (RCM_SUCCESS);
return (RCM_SUCCESS);
if (!node) {
return (RCM_FAILURE);
return (RCM_SUCCESS);
return (RCM_FAILURE);
return (RCM_FAILURE);
return (RCM_SUCCESS);
int numifs;
char *buf;
char *nic;
const char *fmt;
char *sep;
int offline = 0;
numifs = 0;
numifs++;
offline++;
} else if (offline) {
return (NULL);
return (buf);
void *addr;
int af;
af);
numifs--;
if (numifs > 0) {
return (buf);
static ip_cache_t *
return (NULL);
return (probe);
return (NULL);
if (node) {
if (pif) {
while (lif) {
int lif_listed = 0;
lif_listed++;
if (!lif_listed) {
int sock;
char *buf;
lifrp++;
int rv;
for (i = 0; i < IP_MAX_MODS; i++) {
int len;
const char *errfmt;
char *error;
if (!force) {
ipv4++;
ipv6++;
if (ipv4) {
if (ipv6) {
for (i = 0; i < IP_MAX_MODS; i++) {
* get_physical_resource() - Convert a name (e.g., "SUNW_network/hme0:1" or
* "SUNW_network/hme1000") into a dynamically allocated string containing the
* associated physical device resource name ("SUNW_network/hme0"). Since we
return (NULL);
return (NULL);
return (ifname);
static uint64_t
for (i = 0; i < MPATHD_MAX_RETRIES; i++) {
case MI_OFFLINE :
sizeof (mpathd_cmd_t)) {
(void) close(s);
case MI_SETOINDEX :
sizeof (mpathd_cmd_t)) {
(void) close(s);
case MI_UNDO_OFFLINE:
sizeof (mpathd_unoffline_t)) {
(void) close(s);
(void) close(s);
sizeof (struct mpathd_response)) {
(void) close(s);
(void) close(s);
int addrlen;
int ret;
int on;
sizeof (on)) < 0) {
switch (family) {
case AF_INET:
case AF_INET6:
if (ret != 0) {
switch (family) {
case AF_INET:
case AF_INET6:
if (ret != 0) {
if (ret != 0) {
on = 0;
sizeof (on)) < 0) {
pos);
pos);
int mux_fd;
int muxid_fd;
int fd;
int num_mods;
* Stolen from ifconfig.c
int muxid_fd;
char *udp_dev_name;
* Stolen from ifconfig.c
int mux_id;
char **addrlist;
return (ret);
return (ret);
char **addrlist;
return (RCM_SUCCESS);
!= RCM_SUCCESS) {
return (ret);
int numifs;
void *addr;
int af;
numifs = 0;
numifs++;
return (NULL);
af);
return (NULL);
== NULL) {
return (NULL);
return (addrlist);
char *cp;
if (cp) {
*cp = 0;
ifname);
char *driver_name;
char *devfs_path;
sizeof (struct devfs_minor_data));
NULL) {
mdata);
struct ni_list *p;
char *cname;
instance);
if (p != NULL) {
char *cp;
int af = 0;
int ipmp = 0;
if (cp) {
*cp = 0;
ipmp++;
ipmp++;
int ntok;
int group = 0;
while (ntok) {
group++;
ntok--;
if (group <= 0) {
cfgfile);
cfgfile);
char *buf;
int nofailover = 0;
int newattach = 0;
int cmdvalid = 0;
int ntok;
int stdif = 0;
ifinst);
ifinst);
newattach++;
newattach++;
stdif++;
nofailover = 0;
cmdvalid = 0;
if (ntok <= 0)
if (newattach) {
for (n = 0; n < ntok; n++) {
nofailover++;
nofailover--;
cmdvalid++;
if (!cmdvalid) {
cmdvalid++;
if (nofailover > 0) {
fstr);
nofailover = 0;
cmdvalid = 0;
cmdvalid++;
* The group name needs to be set after all the test/nofailover
int ntok;
char *addr;
char *from_lifname;
if (ntok <= 0)
for (n = 0; n < ntok; n++) {
int sock;
char *buf;
int err;
return (NULL);
return (NULL);
return (NULL);
return (NULL);
return (NULL);
if (hp) {
return (NULL);
return (NULL);
addr);
return (ifname);
int sock;
char *cp;
char *sp;
cp++;