Lines Matching defs:sctp_ifap

251 sctp_free_ifa(struct sctp_ifa *sctp_ifap)
253 if (SCTP_DECREMENT_AND_CHECK_REFCOUNT(&sctp_ifap->refcount)) {
255 if (sctp_ifap->ifn_p) {
256 sctp_free_ifn(sctp_ifap->ifn_p);
258 SCTP_FREE(sctp_ifap, SCTP_M_IFA);
283 sctp_add_ifa_to_ifn(struct sctp_ifn *sctp_ifnp, struct sctp_ifa *sctp_ifap)
288 LIST_INSERT_HEAD(&sctp_ifnp->ifalist, sctp_ifap, next_ifa);
289 sctp_ifap->ifn_p = sctp_ifnp;
290 atomic_add_int(&sctp_ifap->ifn_p->refcount, 1);
293 ifa_af = sctp_ifap->address.sa.sa_family;
320 sctp_remove_ifa_from_ifn(struct sctp_ifa *sctp_ifap)
323 LIST_REMOVE(sctp_ifap, next_ifa);
324 if (sctp_ifap->ifn_p) {
326 sctp_ifap->ifn_p->ifa_count--;
327 switch (sctp_ifap->address.sa.sa_family) {
330 sctp_ifap->ifn_p->num_v4--;
335 sctp_ifap->ifn_p->num_v6--;
342 if (LIST_EMPTY(&sctp_ifap->ifn_p->ifalist)) {
344 sctp_delete_ifn(sctp_ifap->ifn_p);
347 if ((sctp_ifap->ifn_p->num_v6 == 0) &&
348 (sctp_ifap->ifn_p->registered_af == AF_INET6)) {
349 sctp_ifap->ifn_p->registered_af = AF_INET;
350 } else if ((sctp_ifap->ifn_p->num_v4 == 0) &&
351 (sctp_ifap->ifn_p->registered_af == AF_INET)) {
352 sctp_ifap->ifn_p->registered_af = AF_INET6;
355 sctp_free_ifn(sctp_ifap->ifn_p);
357 sctp_ifap->ifn_p = NULL;
369 struct sctp_ifa *sctp_ifap, *new_sctp_ifap;
437 sctp_ifap = sctp_find_ifa_by_addr(addr, vrf->vrf_id, SCTP_ADDR_LOCKED);
438 if (sctp_ifap != NULL) {
440 if (sctp_ifap->ifn_p != NULL) {
441 if (sctp_ifap->ifn_p->ifn_index == ifn_index &&
442 sctp_ifap->ifn_p->ifn_p == ifn) {
445 sctp_ifap->ifn_p->ifn_name, ifn_index,
446 (void *)sctp_ifap);
451 if (sctp_ifap->localifa_flags & SCTP_BEING_DELETED) {
455 sctp_ifap->localifa_flags = SCTP_ADDR_VALID;
456 sctp_ifap->ifn_p = sctp_ifnp;
457 atomic_add_int(&sctp_ifap->ifn_p->refcount, 1);
466 (void *)sctp_ifap,
467 sctp_ifap->ifn_p->ifn_name,
468 sctp_ifap->ifn_p->ifn_index, if_name,
471 sctp_remove_ifa_from_ifn(sctp_ifap);
473 sctp_add_ifa_to_ifn(sctp_ifnp, sctp_ifap);
477 sctp_ifap->localifa_flags = SCTP_ADDR_VALID;
480 (void *)sctp_ifnp, (void *)sctp_ifap);
481 sctp_add_ifa_to_ifn(sctp_ifnp, sctp_ifap);
488 return (sctp_ifap);
492 KASSERT(sctp_ifap == NULL,
493 ("sctp_add_addr_to_vrf: sctp_ifap (%p) != NULL", sctp_ifap));
494 sctp_ifap = new_sctp_ifap;
495 memset(sctp_ifap, 0, sizeof(struct sctp_ifa));
496 sctp_ifap->ifn_p = sctp_ifnp;
498 sctp_ifap->vrf_id = vrf_id;
499 sctp_ifap->ifa = ifa;
500 memcpy(&sctp_ifap->address, addr, addr->sa_len);
501 sctp_ifap->localifa_flags = SCTP_ADDR_VALID | SCTP_ADDR_DEFER_USE;
502 sctp_ifap->flags = ifa_flags;
504 switch (sctp_ifap->address.sa.sa_family) {
510 sin = &sctp_ifap->address.sin;
511 if (SCTP_IFN_IS_IFT_LOOP(sctp_ifap->ifn_p) ||
513 sctp_ifap->src_is_loop = 1;
516 sctp_ifap->src_is_priv = 1;
530 sin6 = &sctp_ifap->address.sin6;
531 if (SCTP_IFN_IS_IFT_LOOP(sctp_ifap->ifn_p) ||
533 sctp_ifap->src_is_loop = 1;
536 sctp_ifap->src_is_priv = 1;
547 hash_of_addr = sctp_get_ifa_hash_val(&sctp_ifap->address.sa);
549 if ((sctp_ifap->src_is_priv == 0) &&
550 (sctp_ifap->src_is_loop == 0)) {
551 sctp_ifap->src_is_glob = 1;
554 LIST_INSERT_HEAD(hash_addr_head, sctp_ifap, next_bucket);
555 sctp_ifap->refcount = 1;
556 LIST_INSERT_HEAD(&sctp_ifnp->ifalist, sctp_ifap, next_ifa);
572 atomic_add_int(&sctp_ifap->refcount, 1);
587 wi->ifa = sctp_ifap;
599 sctp_ifap->localifa_flags &= ~SCTP_ADDR_DEFER_USE;
601 return (sctp_ifap);
609 struct sctp_ifa *sctp_ifap;
623 sctp_ifap = sctp_find_ifa_by_addr(addr, vrf->vrf_id, SCTP_ADDR_LOCKED);
624 if (sctp_ifap != NULL) {
626 if (sctp_ifap->ifn_p) {
627 if (ifn_index != sctp_ifap->ifn_p->ifn_index ||
628 ifn != sctp_ifap->ifn_p->ifn_p) {
630 sctp_ifap->ifn_p->ifn_index,
631 sctp_ifap->ifn_p->ifn_p,
632 sctp_ifap->ifn_p->ifn_name);
637 SCTPDBG(SCTP_DEBUG_PCB4, "Deleting ifa %p\n", (void *)sctp_ifap);
638 sctp_ifap->localifa_flags &= SCTP_ADDR_VALID;
646 /* sctp_ifap->localifa_flags |= SCTP_BEING_DELETED; */
648 LIST_REMOVE(sctp_ifap, next_bucket);
649 sctp_remove_ifa_from_ifn(sctp_ifap);
660 if (sctp_ifap != NULL) {
672 sctp_free_ifa(sctp_ifap);
678 wi->ifa = sctp_ifap;
2692 * sctp_ifap is used to bypass normal local address validation checks.
2696 struct sctp_ifa *sctp_ifap, struct thread *td)
3032 if (sctp_ifap != NULL) {
3033 ifa = sctp_ifap;
3037 * pass things in via the sctp_ifap argument.
3097 struct sctp_ifa *sctp_ifap, struct thread *td)
3105 error = sctp_inpcb_bind_locked(inp, addr, sctp_ifap, td);