| 1085 | } |
| 1086 | |
| 1087 | static int |
| 1088 | add_addrsel_policyent(struct in6_addrpolicy *newpolicy) |
| 1089 | { |
| 1090 | struct addrsel_policyent *new, *pol; |
| 1091 | |
| 1092 | new = malloc(sizeof(*new), M_IFADDR, |
| 1093 | M_WAITOK); |
| 1094 | ADDRSEL_XLOCK(); |
| 1095 | ADDRSEL_LOCK(); |
| 1096 | |
| 1097 | /* duplication check */ |
| 1098 | TAILQ_FOREACH(pol, &V_addrsel_policytab, ape_entry) { |
| 1099 | if (IN6_ARE_ADDR_EQUAL(&newpolicy->addr.sin6_addr, |
| 1100 | &pol->ape_policy.addr.sin6_addr) && |
| 1101 | IN6_ARE_ADDR_EQUAL(&newpolicy->addrmask.sin6_addr, |
| 1102 | &pol->ape_policy.addrmask.sin6_addr)) { |
| 1103 | ADDRSEL_UNLOCK(); |
| 1104 | ADDRSEL_XUNLOCK(); |
| 1105 | free(new, M_IFADDR); |
| 1106 | return (EEXIST); /* or override it? */ |
| 1107 | } |
| 1108 | } |
| 1109 | |
| 1110 | bzero(new, sizeof(*new)); |
| 1111 | |
| 1112 | /* XXX: should validate entry */ |
| 1113 | new->ape_policy = *newpolicy; |
| 1114 | |
| 1115 | TAILQ_INSERT_TAIL(&V_addrsel_policytab, new, ape_entry); |
| 1116 | ADDRSEL_UNLOCK(); |
| 1117 | ADDRSEL_XUNLOCK(); |
| 1118 | |
| 1119 | return (0); |
| 1120 | } |
| 1121 | |
| 1122 | static int |
| 1123 | delete_addrsel_policyent(struct in6_addrpolicy *key) |
no test coverage detected