this is what's needed to parse the necessary arguments for AOE.  still
can't create devices yet, as there have been some kernel changes to
metadata handling, but I think this will suffice for userland.

Index: bioctl.c
===================================================================
RCS file: /home/tedu/cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.100
diff -u -p -r1.100 bioctl.c
--- bioctl.c    4 Jul 2011 04:52:34 -0000       1.100
+++ bioctl.c    7 Jul 2011 04:20:51 -0000
@@ -691,12 +691,57 @@ bio_blink(char *enclosure, int target, i
        close(bioh);
 }
 
+struct sr_aoe_config *
+create_aoe(u_int16_t level, char *dev_list)
+{
+       static struct sr_aoe_config sac;
+       char *nic;
+       char *dsteaddr;
+       char *shelf;
+       char *slot;
+       struct ether_addr *eaddr;
+       const char *errstr;
+
+       nic = dsteaddr = slot = shelf = 0;
+
+       memset(&sac, 0, sizeof(sac));
+       nic = dev_list;
+       dsteaddr = strchr(nic, ',');
+       if (!dsteaddr)
+               goto invalid;
+       *dsteaddr++ = '\0';
+       shelf = strchr(dsteaddr, ',');
+       if (!shelf)
+               goto invalid;
+       *shelf++ = '\0';
+       slot = strchr(shelf, ',');
+       if (!slot)
+               goto invalid;
+       *slot++ = '\0';
+       strlcpy(sac.nic, nic, sizeof(sac.nic));
+       eaddr = ether_aton(dsteaddr);
+       if (!eaddr)
+               goto invalid;
+       sac.dsteaddr = *eaddr;
+       sac.shelf = htons(strtonum(shelf, 0, 0xfffe, &errstr));
+       if (errstr)
+               goto invalid;
+       sac.slot = strtonum(slot, 0, 0xfe, &errstr);
+       if (errstr)
+               goto invalid;
+
+       return &sac;
+invalid:
+       errx(1, "invalid AOE dev list: use nic,dsteaddr,shelf,slot");
+}
+
 void
 bio_createraid(u_int16_t level, char *dev_list, char *key_disk)
 {
        struct bioc_createraid  create;
        struct sr_crypto_kdfinfo kdfinfo;
        struct sr_crypto_kdf_pbkdf2 kdfhint;
+       struct sr_aoe_config    *sac;
        struct stat             sb;
        int                     rv, no_dev, fd;
        dev_t                   *dt;
@@ -705,12 +750,18 @@ bio_createraid(u_int16_t level, char *de
        if (!dev_list)
                errx(1, "no devices specified");
 
-       dt = (dev_t *)malloc(BIOC_CRMAXLEN);
-       if (!dt)
-               err(1, "not enough memory for dev_t list");
-       memset(dt, 0, BIOC_CRMAXLEN);
+       if (level == 'a') {
+               sac = create_aoe(level, dev_list);
+               no_dev = 0;
+               dt = NULL;
+       } else  {
+               dt = (dev_t *)malloc(BIOC_CRMAXLEN);
+               if (!dt)
+                       err(1, "not enough memory for dev_t list");
+               memset(dt, 0, BIOC_CRMAXLEN);
 
-       no_dev = bio_parse_devlist(dev_list, dt);
+               no_dev = bio_parse_devlist(dev_list, dt);
+       }
 
        switch (level) {
        case 0:
@@ -729,6 +780,8 @@ bio_createraid(u_int16_t level, char *de
        case 'c':
                min_disks = 1;
                break;
+       case 'a':
+               break;
        default:
                errx(1, "unsupported raid level");
        }
@@ -748,7 +801,11 @@ bio_createraid(u_int16_t level, char *de
        create.bc_flags = BIOC_SCDEVT | cflags;
        create.bc_key_disk = NODEV;
 
-       if (level == 'C' && key_disk == NULL) {
+       if (level == 'a') {
+               create.bc_opaque = sac;
+               create.bc_opaque_size = sizeof(*sac);
+               create.bc_opaque_flags = BIOC_SOIN;
+       } else if (level == 'C' && key_disk == NULL) {
 
                memset(&kdfinfo, 0, sizeof(kdfinfo));
                memset(&kdfhint, 0, sizeof(kdfhint));

Reply via email to