Lines Matching +full:entry +full:- +full:address

1 // SPDX-License-Identifier: GPL-2.0
13 &((__msk)->pm.userspace_pm_local_addr_list), list)
17 struct mptcp_pm_addr_entry *entry, *tmp; in mptcp_free_local_addr_list() local
24 spin_lock_bh(&msk->pm.lock); in mptcp_free_local_addr_list()
25 list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list); in mptcp_free_local_addr_list()
26 spin_unlock_bh(&msk->pm.lock); in mptcp_free_local_addr_list()
28 list_for_each_entry_safe(entry, tmp, &free_list, list) { in mptcp_free_local_addr_list()
29 sock_kfree_s(sk, entry, sizeof(*entry)); in mptcp_free_local_addr_list()
37 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_lookup_addr() local
39 mptcp_for_each_userspace_pm_addr(msk, entry) { in mptcp_userspace_pm_lookup_addr()
40 if (mptcp_addresses_equal(&entry->addr, addr, false)) in mptcp_userspace_pm_lookup_addr()
41 return entry; in mptcp_userspace_pm_lookup_addr()
47 struct mptcp_pm_addr_entry *entry, in mptcp_userspace_pm_append_new_local_addr() argument
56 int ret = -EINVAL; in mptcp_userspace_pm_append_new_local_addr()
60 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_append_new_local_addr()
62 addr_match = mptcp_addresses_equal(&e->addr, &entry->addr, true); in mptcp_userspace_pm_append_new_local_addr()
63 if (addr_match && entry->addr.id == 0 && needs_id) in mptcp_userspace_pm_append_new_local_addr()
64 entry->addr.id = e->addr.id; in mptcp_userspace_pm_append_new_local_addr()
65 id_match = (e->addr.id == entry->addr.id); in mptcp_userspace_pm_append_new_local_addr()
72 __set_bit(e->addr.id, id_bitmap); in mptcp_userspace_pm_append_new_local_addr()
76 /* Memory for the entry is allocated from the in mptcp_userspace_pm_append_new_local_addr()
81 ret = -ENOMEM; in mptcp_userspace_pm_append_new_local_addr()
85 *e = *entry; in mptcp_userspace_pm_append_new_local_addr()
86 if (!e->addr.id && needs_id) in mptcp_userspace_pm_append_new_local_addr()
87 e->addr.id = find_next_zero_bit(id_bitmap, in mptcp_userspace_pm_append_new_local_addr()
90 list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list); in mptcp_userspace_pm_append_new_local_addr()
91 msk->pm.local_addr_used++; in mptcp_userspace_pm_append_new_local_addr()
92 ret = e->addr.id; in mptcp_userspace_pm_append_new_local_addr()
94 ret = entry->addr.id; in mptcp_userspace_pm_append_new_local_addr()
98 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_append_new_local_addr()
103 * subflow destroy command then), we want to keep the entry
104 * not to assign the same ID to another address and to be
111 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_delete_local_addr() local
113 entry = mptcp_userspace_pm_lookup_addr(msk, &addr->addr); in mptcp_userspace_pm_delete_local_addr()
114 if (!entry) in mptcp_userspace_pm_delete_local_addr()
115 return -EINVAL; in mptcp_userspace_pm_delete_local_addr()
117 /* TODO: a refcount is needed because the entry can in mptcp_userspace_pm_delete_local_addr()
120 list_del_rcu(&entry->list); in mptcp_userspace_pm_delete_local_addr()
121 sock_kfree_s(sk, entry, sizeof(*entry)); in mptcp_userspace_pm_delete_local_addr()
122 msk->pm.local_addr_used--; in mptcp_userspace_pm_delete_local_addr()
129 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_lookup_addr_by_id() local
131 mptcp_for_each_userspace_pm_addr(msk, entry) { in mptcp_userspace_pm_lookup_addr_by_id()
132 if (entry->addr.id == id) in mptcp_userspace_pm_lookup_addr_by_id()
133 return entry; in mptcp_userspace_pm_lookup_addr_by_id()
141 struct mptcp_pm_addr_entry *entry = NULL, new_entry; in mptcp_userspace_pm_get_local_id() local
143 inet_sk((struct sock *)msk))->inet_sport; in mptcp_userspace_pm_get_local_id()
145 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_get_local_id()
146 entry = mptcp_userspace_pm_lookup_addr(msk, skc); in mptcp_userspace_pm_get_local_id()
147 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_get_local_id()
148 if (entry) in mptcp_userspace_pm_get_local_id()
149 return entry->addr.id; in mptcp_userspace_pm_get_local_id()
165 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_is_backup() local
168 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_is_backup()
169 entry = mptcp_userspace_pm_lookup_addr(msk, skc); in mptcp_userspace_pm_is_backup()
170 backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); in mptcp_userspace_pm_is_backup()
171 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_is_backup()
178 struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; in mptcp_userspace_pm_get_sock()
188 NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); in mptcp_userspace_pm_get_sock()
203 struct nlattr *addr = info->attrs[MPTCP_PM_ATTR_ADDR]; in mptcp_pm_nl_announce_doit()
206 int err = -EINVAL; in mptcp_pm_nl_announce_doit()
210 GENL_SET_ERR_MSG(info, "missing required address"); in mptcp_pm_nl_announce_doit()
222 GENL_SET_ERR_MSG(info, "error parsing local address"); in mptcp_pm_nl_announce_doit()
228 err = -EINVAL; in mptcp_pm_nl_announce_doit()
234 GENL_SET_ERR_MSG(info, "did not match address and id"); in mptcp_pm_nl_announce_doit()
239 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_announce_doit()
242 msk->pm.add_addr_signaled++; in mptcp_pm_nl_announce_doit()
247 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_announce_doit()
263 int err = -EINVAL; in mptcp_userspace_pm_remove_id_zero_address()
267 if (READ_ONCE(subflow->local_id) == 0) { in mptcp_userspace_pm_remove_id_zero_address()
273 GENL_SET_ERR_MSG(info, "address with id 0 not found"); in mptcp_userspace_pm_remove_id_zero_address()
279 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_remove_id_zero_address()
281 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_remove_id_zero_address()
291 struct mptcp_pm_addr_entry *entry) in mptcp_pm_remove_addr_entry() argument
297 if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr)) in mptcp_pm_remove_addr_entry()
299 else if (!mptcp_lookup_subflow_by_saddr(&msk->conn_list, &entry->addr)) in mptcp_pm_remove_addr_entry()
302 alist.ids[alist.nr++] = entry->addr.id; in mptcp_pm_remove_addr_entry()
304 spin_lock_bh(&msk->pm.lock); in mptcp_pm_remove_addr_entry()
305 msk->pm.add_addr_signaled -= anno_nr; in mptcp_pm_remove_addr_entry()
307 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_remove_addr_entry()
312 struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID]; in mptcp_pm_nl_remove_doit()
315 int err = -EINVAL; in mptcp_pm_nl_remove_doit()
339 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_remove_doit()
342 GENL_SET_ERR_MSG(info, "address with specified id not found"); in mptcp_pm_nl_remove_doit()
343 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_remove_doit()
348 list_del_rcu(&match->list); in mptcp_pm_nl_remove_doit()
349 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_remove_doit()
365 struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; in mptcp_pm_nl_subflow_create_doit()
366 struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR]; in mptcp_pm_nl_subflow_create_doit()
367 struct mptcp_pm_addr_entry entry = { 0 }; in mptcp_pm_nl_subflow_create_doit() local
371 int err = -EINVAL; in mptcp_pm_nl_subflow_create_doit()
375 GENL_SET_ERR_MSG(info, "missing required address(es)"); in mptcp_pm_nl_subflow_create_doit()
385 err = mptcp_pm_parse_entry(laddr, info, true, &entry); in mptcp_pm_nl_subflow_create_doit()
387 NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); in mptcp_pm_nl_subflow_create_doit()
391 if (entry.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) { in mptcp_pm_nl_subflow_create_doit()
393 err = -EINVAL; in mptcp_pm_nl_subflow_create_doit()
396 entry.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW; in mptcp_pm_nl_subflow_create_doit()
400 NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); in mptcp_pm_nl_subflow_create_doit()
404 if (!mptcp_pm_addr_families_match(sk, &entry.addr, &addr_r)) { in mptcp_pm_nl_subflow_create_doit()
406 err = -EINVAL; in mptcp_pm_nl_subflow_create_doit()
410 err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false); in mptcp_pm_nl_subflow_create_doit()
412 GENL_SET_ERR_MSG(info, "did not match address and id"); in mptcp_pm_nl_subflow_create_doit()
416 local.addr = entry.addr; in mptcp_pm_nl_subflow_create_doit()
417 local.flags = entry.flags; in mptcp_pm_nl_subflow_create_doit()
418 local.ifindex = entry.ifindex; in mptcp_pm_nl_subflow_create_doit()
424 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_subflow_create_doit()
426 mptcp_userspace_pm_delete_local_addr(msk, &entry); in mptcp_pm_nl_subflow_create_doit()
428 msk->pm.subflows++; in mptcp_pm_nl_subflow_create_doit()
429 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_subflow_create_doit()
442 if (local->family != remote->family) in mptcp_nl_find_ssk()
451 if (local->family != ssk->sk_family) in mptcp_nl_find_ssk()
456 switch (ssk->sk_family) { in mptcp_nl_find_ssk()
458 if (issk->inet_saddr != local->addr.s_addr || in mptcp_nl_find_ssk()
459 issk->inet_daddr != remote->addr.s_addr) in mptcp_nl_find_ssk()
466 if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || in mptcp_nl_find_ssk()
467 !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) in mptcp_nl_find_ssk()
476 if (issk->inet_sport == local->port && in mptcp_nl_find_ssk()
477 issk->inet_dport == remote->port) in mptcp_nl_find_ssk()
486 struct nlattr *raddr = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; in mptcp_pm_nl_subflow_destroy_doit()
487 struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR]; in mptcp_pm_nl_subflow_destroy_doit()
492 int err = -EINVAL; in mptcp_pm_nl_subflow_destroy_doit()
495 GENL_SET_ERR_MSG(info, "missing required address(es)"); in mptcp_pm_nl_subflow_destroy_doit()
507 NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); in mptcp_pm_nl_subflow_destroy_doit()
513 NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); in mptcp_pm_nl_subflow_destroy_doit()
528 GENL_SET_ERR_MSG(info, "address families do not match"); in mptcp_pm_nl_subflow_destroy_doit()
529 err = -EINVAL; in mptcp_pm_nl_subflow_destroy_doit()
535 err = -EINVAL; in mptcp_pm_nl_subflow_destroy_doit()
542 err = -ESRCH; in mptcp_pm_nl_subflow_destroy_doit()
546 spin_lock_bh(&msk->pm.lock); in mptcp_pm_nl_subflow_destroy_doit()
548 spin_unlock_bh(&msk->pm.lock); in mptcp_pm_nl_subflow_destroy_doit()
564 struct nlattr *attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; in mptcp_userspace_pm_set_flags()
565 struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; in mptcp_userspace_pm_set_flags()
566 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_set_flags() local
568 int ret = -EINVAL; in mptcp_userspace_pm_set_flags()
590 GENL_SET_ERR_MSG(info, "invalid address families"); in mptcp_userspace_pm_set_flags()
591 ret = -EINVAL; in mptcp_userspace_pm_set_flags()
598 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_set_flags()
599 entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr); in mptcp_userspace_pm_set_flags()
600 if (entry) { in mptcp_userspace_pm_set_flags()
602 entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; in mptcp_userspace_pm_set_flags()
604 entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; in mptcp_userspace_pm_set_flags()
606 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_set_flags()
624 struct mptcp_pm_addr_entry *entry; in mptcp_userspace_pm_dump_addr() local
626 int ret = -EINVAL; in mptcp_userspace_pm_dump_addr()
630 bitmap = (struct id_bitmap *)cb->ctx; in mptcp_userspace_pm_dump_addr()
639 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_dump_addr()
640 mptcp_for_each_userspace_pm_addr(msk, entry) { in mptcp_userspace_pm_dump_addr()
641 if (test_bit(entry->addr.id, bitmap->map)) in mptcp_userspace_pm_dump_addr()
644 hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid, in mptcp_userspace_pm_dump_addr()
645 cb->nlh->nlmsg_seq, &mptcp_genl_family, in mptcp_userspace_pm_dump_addr()
650 if (mptcp_nl_fill_addr(msg, entry) < 0) { in mptcp_userspace_pm_dump_addr()
655 __set_bit(entry->addr.id, bitmap->map); in mptcp_userspace_pm_dump_addr()
658 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_dump_addr()
660 ret = msg->len; in mptcp_userspace_pm_dump_addr()
669 struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR]; in mptcp_userspace_pm_get_addr()
670 struct mptcp_pm_addr_entry addr, *entry; in mptcp_userspace_pm_get_addr() local
673 int ret = -EINVAL; in mptcp_userspace_pm_get_addr()
689 ret = -ENOMEM; in mptcp_userspace_pm_get_addr()
694 info->genlhdr->cmd); in mptcp_userspace_pm_get_addr()
697 ret = -EMSGSIZE; in mptcp_userspace_pm_get_addr()
702 spin_lock_bh(&msk->pm.lock); in mptcp_userspace_pm_get_addr()
703 entry = mptcp_userspace_pm_lookup_addr_by_id(msk, addr.addr.id); in mptcp_userspace_pm_get_addr()
704 if (!entry) { in mptcp_userspace_pm_get_addr()
705 GENL_SET_ERR_MSG(info, "address not found"); in mptcp_userspace_pm_get_addr()
706 ret = -EINVAL; in mptcp_userspace_pm_get_addr()
710 ret = mptcp_nl_fill_addr(msg, entry); in mptcp_userspace_pm_get_addr()
716 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_get_addr()
722 spin_unlock_bh(&msk->pm.lock); in mptcp_userspace_pm_get_addr()