1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * net/tipc/subscr.h: Include file for TIPC network topology service 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (c) 2003-2017, Ericsson AB 5*4882a593Smuzhiyun * Copyright (c) 2005-2007, 2012-2013, Wind River Systems 6*4882a593Smuzhiyun * All rights reserved. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Redistribution and use in source and binary forms, with or without 9*4882a593Smuzhiyun * modification, are permitted provided that the following conditions are met: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * 1. Redistributions of source code must retain the above copyright 12*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer. 13*4882a593Smuzhiyun * 2. Redistributions in binary form must reproduce the above copyright 14*4882a593Smuzhiyun * notice, this list of conditions and the following disclaimer in the 15*4882a593Smuzhiyun * documentation and/or other materials provided with the distribution. 16*4882a593Smuzhiyun * 3. Neither the names of the copyright holders nor the names of its 17*4882a593Smuzhiyun * contributors may be used to endorse or promote products derived from 18*4882a593Smuzhiyun * this software without specific prior written permission. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * Alternatively, this software may be distributed under the terms of the 21*4882a593Smuzhiyun * GNU General Public License ("GPL") version 2 as published by the Free 22*4882a593Smuzhiyun * Software Foundation. 23*4882a593Smuzhiyun * 24*4882a593Smuzhiyun * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 25*4882a593Smuzhiyun * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26*4882a593Smuzhiyun * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27*4882a593Smuzhiyun * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 28*4882a593Smuzhiyun * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 29*4882a593Smuzhiyun * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 30*4882a593Smuzhiyun * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 31*4882a593Smuzhiyun * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 32*4882a593Smuzhiyun * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 33*4882a593Smuzhiyun * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 34*4882a593Smuzhiyun * POSSIBILITY OF SUCH DAMAGE. 35*4882a593Smuzhiyun */ 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #ifndef _TIPC_SUBSCR_H 38*4882a593Smuzhiyun #define _TIPC_SUBSCR_H 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #include "topsrv.h" 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define TIPC_MAX_SUBSCR 65535 43*4882a593Smuzhiyun #define TIPC_MAX_PUBL 65535 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun struct tipc_subscription; 46*4882a593Smuzhiyun struct tipc_conn; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /** 49*4882a593Smuzhiyun * struct tipc_subscription - TIPC network topology subscription object 50*4882a593Smuzhiyun * @subscriber: pointer to its subscriber 51*4882a593Smuzhiyun * @seq: name sequence associated with subscription 52*4882a593Smuzhiyun * @timer: timer governing subscription duration (optional) 53*4882a593Smuzhiyun * @nameseq_list: adjacent subscriptions in name sequence's subscription list 54*4882a593Smuzhiyun * @sub_list: adjacent subscriptions in subscriber's subscription list 55*4882a593Smuzhiyun * @evt: template for events generated by subscription 56*4882a593Smuzhiyun */ 57*4882a593Smuzhiyun struct tipc_subscription { 58*4882a593Smuzhiyun struct kref kref; 59*4882a593Smuzhiyun struct net *net; 60*4882a593Smuzhiyun struct timer_list timer; 61*4882a593Smuzhiyun struct list_head service_list; 62*4882a593Smuzhiyun struct list_head sub_list; 63*4882a593Smuzhiyun struct tipc_event evt; 64*4882a593Smuzhiyun int conid; 65*4882a593Smuzhiyun bool inactive; 66*4882a593Smuzhiyun spinlock_t lock; /* serialize up/down and timer events */ 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct tipc_subscription *tipc_sub_subscribe(struct net *net, 70*4882a593Smuzhiyun struct tipc_subscr *s, 71*4882a593Smuzhiyun int conid); 72*4882a593Smuzhiyun void tipc_sub_unsubscribe(struct tipc_subscription *sub); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun int tipc_sub_check_overlap(struct tipc_name_seq *seq, u32 found_lower, 75*4882a593Smuzhiyun u32 found_upper); 76*4882a593Smuzhiyun void tipc_sub_report_overlap(struct tipc_subscription *sub, 77*4882a593Smuzhiyun u32 found_lower, u32 found_upper, 78*4882a593Smuzhiyun u32 event, u32 port, u32 node, 79*4882a593Smuzhiyun u32 scope, int must); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun int __net_init tipc_topsrv_init_net(struct net *net); 82*4882a593Smuzhiyun void __net_exit tipc_topsrv_exit_net(struct net *net); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun void tipc_sub_put(struct tipc_subscription *subscription); 85*4882a593Smuzhiyun void tipc_sub_get(struct tipc_subscription *subscription); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define TIPC_FILTER_MASK (TIPC_SUB_PORTS | TIPC_SUB_SERVICE | TIPC_SUB_CANCEL) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun /* tipc_sub_read - return field_ of struct sub_ in host endian format 90*4882a593Smuzhiyun */ 91*4882a593Smuzhiyun #define tipc_sub_read(sub_, field_) \ 92*4882a593Smuzhiyun ({ \ 93*4882a593Smuzhiyun struct tipc_subscr *sub__ = sub_; \ 94*4882a593Smuzhiyun u32 val__ = (sub__)->field_; \ 95*4882a593Smuzhiyun int swap_ = !((sub__)->filter & TIPC_FILTER_MASK); \ 96*4882a593Smuzhiyun (swap_ ? swab32(val__) : val__); \ 97*4882a593Smuzhiyun }) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* tipc_sub_write - write val_ to field_ of struct sub_ in user endian format 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun #define tipc_sub_write(sub_, field_, val_) \ 102*4882a593Smuzhiyun ({ \ 103*4882a593Smuzhiyun struct tipc_subscr *sub__ = sub_; \ 104*4882a593Smuzhiyun u32 val__ = val_; \ 105*4882a593Smuzhiyun int swap_ = !((sub__)->filter & TIPC_FILTER_MASK); \ 106*4882a593Smuzhiyun (sub__)->field_ = swap_ ? swab32(val__) : val__; \ 107*4882a593Smuzhiyun }) 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun /* tipc_evt_write - write val_ to field_ of struct evt_ in user endian format 110*4882a593Smuzhiyun */ 111*4882a593Smuzhiyun #define tipc_evt_write(evt_, field_, val_) \ 112*4882a593Smuzhiyun ({ \ 113*4882a593Smuzhiyun struct tipc_event *evt__ = evt_; \ 114*4882a593Smuzhiyun u32 val__ = val_; \ 115*4882a593Smuzhiyun int swap_ = !((evt__)->s.filter & (TIPC_FILTER_MASK)); \ 116*4882a593Smuzhiyun (evt__)->field_ = swap_ ? swab32(val__) : val__; \ 117*4882a593Smuzhiyun }) 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun #endif 120