monitor.c (bf1035b2ff5296c7c49e262152253ce29d87e82d) | monitor.c (cf6f7e1d51090772d5ff7355aaf0fcff17f20d1a) |
---|---|
1/* 2 * net/tipc/monitor.c 3 * 4 * Copyright (c) 2016, Ericsson AB 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: --- 19 unchanged lines hidden (view full) --- 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. 34 */ 35 | 1/* 2 * net/tipc/monitor.c 3 * 4 * Copyright (c) 2016, Ericsson AB 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions are met: --- 19 unchanged lines hidden (view full) --- 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33 * POSSIBILITY OF SUCH DAMAGE. 34 */ 35 |
36#include <net/genetlink.h> |
|
36#include "core.h" 37#include "addr.h" 38#include "monitor.h" | 37#include "core.h" 38#include "addr.h" 39#include "monitor.h" |
40#include "bearer.h" |
|
39 40#define MAX_MON_DOMAIN 64 41#define MON_TIMEOUT 120000 42#define MAX_PEER_DOWN_EVENTS 4 43 44/* struct tipc_mon_domain: domain record to be transferred between peers 45 * @len: actual size of domain record 46 * @gen: current generation of sender's domain --- 616 unchanged lines hidden (view full) --- 663} 664 665int tipc_nl_monitor_get_threshold(struct net *net) 666{ 667 struct tipc_net *tn = tipc_net(net); 668 669 return tn->mon_threshold; 670} | 41 42#define MAX_MON_DOMAIN 64 43#define MON_TIMEOUT 120000 44#define MAX_PEER_DOWN_EVENTS 4 45 46/* struct tipc_mon_domain: domain record to be transferred between peers 47 * @len: actual size of domain record 48 * @gen: current generation of sender's domain --- 616 unchanged lines hidden (view full) --- 665} 666 667int tipc_nl_monitor_get_threshold(struct net *net) 668{ 669 struct tipc_net *tn = tipc_net(net); 670 671 return tn->mon_threshold; 672} |
673 674int __tipc_nl_add_monitor_peer(struct tipc_peer *peer, struct tipc_nl_msg *msg) 675{ 676 struct tipc_mon_domain *dom = peer->domain; 677 struct nlattr *attrs; 678 void *hdr; 679 680 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, 681 NLM_F_MULTI, TIPC_NL_MON_PEER_GET); 682 if (!hdr) 683 return -EMSGSIZE; 684 685 attrs = nla_nest_start(msg->skb, TIPC_NLA_MON_PEER); 686 if (!attrs) 687 goto msg_full; 688 689 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_ADDR, peer->addr)) 690 goto attr_msg_full; 691 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_APPLIED, peer->applied)) 692 goto attr_msg_full; 693 694 if (peer->is_up) 695 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_UP)) 696 goto attr_msg_full; 697 if (peer->is_local) 698 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_LOCAL)) 699 goto attr_msg_full; 700 if (peer->is_head) 701 if (nla_put_flag(msg->skb, TIPC_NLA_MON_PEER_HEAD)) 702 goto attr_msg_full; 703 704 if (dom) { 705 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEER_DOMGEN, dom->gen)) 706 goto attr_msg_full; 707 if (nla_put_u64_64bit(msg->skb, TIPC_NLA_MON_PEER_UPMAP, 708 dom->up_map, TIPC_NLA_MON_PEER_PAD)) 709 goto attr_msg_full; 710 if (nla_put(msg->skb, TIPC_NLA_MON_PEER_MEMBERS, 711 dom->member_cnt * sizeof(u32), &dom->members)) 712 goto attr_msg_full; 713 } 714 715 nla_nest_end(msg->skb, attrs); 716 genlmsg_end(msg->skb, hdr); 717 return 0; 718 719attr_msg_full: 720 nla_nest_cancel(msg->skb, attrs); 721msg_full: 722 genlmsg_cancel(msg->skb, hdr); 723 724 return -EMSGSIZE; 725} 726 727int tipc_nl_add_monitor_peer(struct net *net, struct tipc_nl_msg *msg, 728 u32 bearer_id, u32 *prev_node) 729{ 730 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); 731 struct tipc_peer *peer = mon->self; 732 733 if (!mon) 734 return -EINVAL; 735 736 read_lock_bh(&mon->lock); 737 do { 738 if (*prev_node) { 739 if (peer->addr == *prev_node) 740 *prev_node = 0; 741 else 742 continue; 743 } 744 if (__tipc_nl_add_monitor_peer(peer, msg)) { 745 *prev_node = peer->addr; 746 read_unlock_bh(&mon->lock); 747 return -EMSGSIZE; 748 } 749 } while ((peer = peer_nxt(peer)) != mon->self); 750 read_unlock_bh(&mon->lock); 751 752 return 0; 753} 754 755int __tipc_nl_add_monitor(struct net *net, struct tipc_nl_msg *msg, 756 u32 bearer_id) 757{ 758 struct tipc_monitor *mon = tipc_monitor(net, bearer_id); 759 char bearer_name[TIPC_MAX_BEARER_NAME]; 760 struct nlattr *attrs; 761 void *hdr; 762 int ret; 763 764 ret = tipc_bearer_get_name(net, bearer_name, bearer_id); 765 if (ret || !mon) 766 return -EINVAL; 767 768 hdr = genlmsg_put(msg->skb, msg->portid, msg->seq, &tipc_genl_family, 769 NLM_F_MULTI, TIPC_NL_MON_GET); 770 if (!hdr) 771 return -EMSGSIZE; 772 773 attrs = nla_nest_start(msg->skb, TIPC_NLA_MON); 774 if (!attrs) 775 goto msg_full; 776 777 read_lock_bh(&mon->lock); 778 if (nla_put_u32(msg->skb, TIPC_NLA_MON_REF, bearer_id)) 779 goto attr_msg_full; 780 if (tipc_mon_is_active(net, mon)) 781 if (nla_put_flag(msg->skb, TIPC_NLA_MON_ACTIVE)) 782 goto attr_msg_full; 783 if (nla_put_string(msg->skb, TIPC_NLA_MON_BEARER_NAME, bearer_name)) 784 goto attr_msg_full; 785 if (nla_put_u32(msg->skb, TIPC_NLA_MON_PEERCNT, mon->peer_cnt)) 786 goto attr_msg_full; 787 if (nla_put_u32(msg->skb, TIPC_NLA_MON_LISTGEN, mon->list_gen)) 788 goto attr_msg_full; 789 790 read_unlock_bh(&mon->lock); 791 nla_nest_end(msg->skb, attrs); 792 genlmsg_end(msg->skb, hdr); 793 794 return 0; 795 796attr_msg_full: 797 nla_nest_cancel(msg->skb, attrs); 798msg_full: 799 genlmsg_cancel(msg->skb, hdr); 800 read_unlock_bh(&mon->lock); 801 802 return -EMSGSIZE; 803} |
|