+ if(sscanf(subnetstr, "%d,", &type) != 1)
+ return NULL;
+
+ subnet = new_subnet();
+
+ switch(type)
+ {
+ case SUBNET_MAC:
+ if(sscanf(subnetstr, "%d,%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &subnet->type,
+ &subnet->net.mac.address.x[0],
+ &subnet->net.mac.address.x[1],
+ &subnet->net.mac.address.x[2],
+ &subnet->net.mac.address.x[3],
+ &subnet->net.mac.address.x[4],
+ &subnet->net.mac.address.x[5]) != 7)
+ {
+ free_subnet(subnet);
+ return NULL;
+ }
+ break;
+ case SUBNET_IPV4:
+ if(sscanf(subnetstr, "%d,%lx:%lx", &subnet->type, &subnet->net.ipv4.address, &subnet->net.ipv4.mask) != 3)
+ {
+ free_subnet(subnet);
+ return NULL;
+ }
+ break;
+ case SUBNET_IPV6:
+ if(sscanf(subnetstr, "%d,%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx/%hx:%hx:%hx:%hx:%hx:%hx:%hx:%hx", &subnet->type,
+ &subnet->net.ipv6.address.x[0],
+ &subnet->net.ipv6.address.x[1],
+ &subnet->net.ipv6.address.x[2],
+ &subnet->net.ipv6.address.x[3],
+ &subnet->net.ipv6.address.x[4],
+ &subnet->net.ipv6.address.x[5],
+ &subnet->net.ipv6.address.x[6],
+ &subnet->net.ipv6.address.x[7],
+ &subnet->net.ipv6.mask.x[0],
+ &subnet->net.ipv6.mask.x[1],
+ &subnet->net.ipv6.mask.x[2],
+ &subnet->net.ipv6.mask.x[3],
+ &subnet->net.ipv6.mask.x[4],
+ &subnet->net.ipv6.mask.x[5],
+ &subnet->net.ipv6.mask.x[6],
+ &subnet->net.ipv6.mask.x[7]) != 17)
+ {
+ free_subnet(subnet);
+ return NULL;
+ }
+ break;
+ break;
+ default:
+ free_subnet(subnet);
+ return NULL;
+ }