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/

Reply via email to