Hi lists,
I implemented a function to IPv6addr.
I'd like to explain the role of attached patch.
It's for changeset:cf020d609b57.
And it's to add a new parameter "nic" to specify interface.
I referred to Dejan's opinion
(http://www.gossamer-threads.com/lists/linuxha/dev/55234).
I would like to hear your opinions.
Best Regards,
Kazunori INOUE
diff -urN linux-ha-dev.org/resources/OCF/IPv6addr.c
linux-ha-dev.mod/resources/OCF/IPv6addr.c
--- linux-ha-dev.org/resources/OCF/IPv6addr.c 2009-07-30 10:01:41.000000000
+0900
+++ linux-ha-dev.mod/resources/OCF/IPv6addr.c 2009-07-30 10:18:29.000000000
+0900
@@ -145,11 +145,11 @@
unsigned int ifr6_ifindex;
};
-static int start_addr6(struct in6_addr* addr6, int prefix_len);
-static int stop_addr6(struct in6_addr* addr6, int prefix_len);
-static int status_addr6(struct in6_addr* addr6, int prefix_len);
+static int start_addr6(struct in6_addr* addr6, int prefix_len, char*
prov_ifname);
+static int stop_addr6(struct in6_addr* addr6, int prefix_len, char*
prov_ifname);
+static int status_addr6(struct in6_addr* addr6, int prefix_len, char*
prov_ifname);
static int monitor_addr6(struct in6_addr* addr6, int prefix_len);
-static int advt_addr6(struct in6_addr* addr6, int prefix_len);
+static int advt_addr6(struct in6_addr* addr6, int prefix_len, char*
prov_ifname);
static int meta_data_addr6(void);
@@ -159,9 +159,9 @@
static void byebye(int nsig);
static char* scan_if(struct in6_addr* addr_target, int* plen_target,
- int use_mask);
-static char* find_if(struct in6_addr* addr_target, int* plen_target);
-static char* get_if(struct in6_addr* addr_target, int* plen_target);
+ int use_mask, char* prov_ifname);
+static char* find_if(struct in6_addr* addr_target, int* plen_target, char*
prov_ifname);
+static char* get_if(struct in6_addr* addr_target, int* plen_target, char*
prov_ifname);
static int assign_addr6(struct in6_addr* addr6, int prefix_len, char* if_name);
static int unassign_addr6(struct in6_addr* addr6, int prefix_len, char*
if_name);
int is_addr6_available(struct in6_addr* addr6);
@@ -174,6 +174,7 @@
char* ipv6addr;
int ret;
char* cp;
+ char* prov_ifname = NULL;
int prefix_len;
struct in6_addr addr6;
@@ -216,6 +217,9 @@
prefix_len = 0;
}
+ /* get provided interface name (optional) */
+ prov_ifname = getenv("OCF_RESKEY_nic");
+
if (inet_pton(AF_INET6, ipv6addr, &addr6) <= 0) {
cl_log(LOG_ERR, "Invalid IPv6 address [%s]", ipv6addr);
usage(argv[0]);
@@ -244,11 +248,11 @@
/* switch the command */
if (0 == strncmp(START_CMD,argv[1], strlen(START_CMD))) {
- ret = start_addr6(&addr6, prefix_len);
+ ret = start_addr6(&addr6, prefix_len, prov_ifname);
}else if (0 == strncmp(STOP_CMD,argv[1], strlen(STOP_CMD))) {
- ret = stop_addr6(&addr6, prefix_len);
+ ret = stop_addr6(&addr6, prefix_len, prov_ifname);
}else if (0 == strncmp(STATUS_CMD,argv[1], strlen(STATUS_CMD))) {
- ret = status_addr6(&addr6, prefix_len);
+ ret = status_addr6(&addr6, prefix_len, prov_ifname);
}else if (0 ==strncmp(MONITOR_CMD,argv[1], strlen(MONITOR_CMD))) {
ret = monitor_addr6(&addr6, prefix_len);
}else if (0 ==strncmp(RELOAD_CMD,argv[1], strlen(RELOAD_CMD))) {
@@ -259,7 +263,7 @@
/* ipv6addr has been validated by inet_pton, hence a valid IPv6 address
*/
ret = OCF_SUCCESS;
}else if (0 ==strncmp(ADVT_CMD,argv[1], strlen(MONITOR_CMD))) {
- ret = advt_addr6(&addr6, prefix_len);
+ ret = advt_addr6(&addr6, prefix_len, prov_ifname);
}else{
usage(argv[0]);
ret = OCF_ERR_ARGS;
@@ -271,16 +275,16 @@
return ret;
}
int
-start_addr6(struct in6_addr* addr6, int prefix_len)
+start_addr6(struct in6_addr* addr6, int prefix_len, char* prov_ifname)
{
int i;
char* if_name;
- if(OCF_SUCCESS == status_addr6(addr6,prefix_len)) {
+ if(OCF_SUCCESS == status_addr6(addr6,prefix_len,prov_ifname)) {
return OCF_SUCCESS;
}
/* we need to find a proper device to assign the address */
- if_name = find_if(addr6, &prefix_len);
+ if_name = find_if(addr6, &prefix_len, prov_ifname);
if (NULL == if_name) {
cl_log(LOG_ERR, "no valid mecahnisms");
return OCF_ERR_GENERIC;
@@ -313,10 +317,10 @@
}
int
-advt_addr6(struct in6_addr* addr6, int prefix_len)
+advt_addr6(struct in6_addr* addr6, int prefix_len, char* prov_ifname)
{
/* First, we need to find a proper device to assign the address */
- char* if_name = get_if(addr6, &prefix_len);
+ char* if_name = get_if(addr6, &prefix_len, prov_ifname);
int i;
if (NULL == if_name) {
cl_log(LOG_ERR, "no valid mecahnisms");
@@ -331,14 +335,14 @@
}
int
-stop_addr6(struct in6_addr* addr6, int prefix_len)
+stop_addr6(struct in6_addr* addr6, int prefix_len, char* prov_ifname)
{
char* if_name;
- if(OCF_NOT_RUNNING == status_addr6(addr6,prefix_len)) {
+ if(OCF_NOT_RUNNING == status_addr6(addr6,prefix_len,prov_ifname)) {
return OCF_SUCCESS;
}
- if_name = get_if(addr6, &prefix_len);
+ if_name = get_if(addr6, &prefix_len, prov_ifname);
if (NULL == if_name) {
cl_log(LOG_ERR, "no valid mechanisms.");
@@ -356,9 +360,9 @@
}
int
-status_addr6(struct in6_addr* addr6, int prefix_len)
+status_addr6(struct in6_addr* addr6, int prefix_len, char* prov_ifname)
{
- char* if_name = get_if(addr6, &prefix_len);
+ char* if_name = get_if(addr6, &prefix_len, prov_ifname);
if (NULL == if_name) {
return OCF_NOT_RUNNING;
}
@@ -441,7 +445,7 @@
/* find the network interface associated with an address */
char*
-scan_if(struct in6_addr* addr_target, int* plen_target, int use_mask)
+scan_if(struct in6_addr* addr_target, int* plen_target, int use_mask, char*
prov_ifname)
{
FILE *f;
static char devname[21]="";
@@ -489,6 +493,15 @@
}
*plen_target = plen;
+ /* If interface name provided, only same devname entry
+ * would be considered
+ */
+ if (prov_ifname!=0 && *prov_ifname!=0)
+ {
+ if (strcmp(devname, prov_ifname))
+ continue;
+ }
+
for (i = 0; i< 4; i++) {
addr.s6_addr32[i] = htonl(addr6p[i]);
}
@@ -527,15 +540,15 @@
}
/* find a proper network interface to assign the address */
char*
-find_if(struct in6_addr* addr_target, int* plen_target)
+find_if(struct in6_addr* addr_target, int* plen_target, char* prov_ifname)
{
- return scan_if(addr_target, plen_target, 1);
+ return scan_if(addr_target, plen_target, 1, prov_ifname);
}
/* get the device name and the plen_target of a special address */
char*
-get_if(struct in6_addr* addr_target, int* plen_target)
+get_if(struct in6_addr* addr_target, int* plen_target, char* prov_ifname)
{
- return scan_if(addr_target, plen_target, 0);
+ return scan_if(addr_target, plen_target, 0, prov_ifname);
}
int
assign_addr6(struct in6_addr* addr6, int prefix_len, char* if_name)
@@ -851,6 +864,13 @@
" <shortdesc lang=\"en\">IPv6 address</shortdesc>\n"
" <content type=\"string\" default=\"\" />\n"
" </parameter>\n"
+ " <parameter name=\"nic\" unique=\"0\">\n"
+ " <longdesc lang=\"en\">\n"
+ " The base network interface on which the IPv6 address will be
brought online.\n"
+ " </longdesc>\n"
+ " <shortdesc lang=\"en\">Network interface</shortdesc>\n"
+ " <content type=\"string\" default=\"\" />\n"
+ " </parameter>\n"
" </parameters>\n"
" <actions>\n"
" <action name=\"start\" timeout=\"15\" />\n"
_______________________________________________________
Linux-HA-Dev: [email protected]
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/