Florian Westphal <[EMAIL PROTECTED]> wrote:
> This adds three helpers for pri/windowsize/tolerance, that share a lot of
> common code. Basically you either have to live with the duplicate
> code or add rather fragile "switch (cmd_type)" conditionals in order
> to figure out what value has to be checked/changed.

Actually the latter isn't as bad as i thought; so here it is:

Enable configuration of default bearer priority/window size/tolerance

Allows to override the compile-time default
values of link tolerance, priority and window size.

use
tipc-config -lt=<link-name|bearer-name|bearer-type>/<tolerance>
tipc-config -lp=<link-name|bearer-name|bearer-type>/<prio>
tipc-config -lw=<link-name|bearer-name|bearer-type>/<window>

to set the desired values.
---
 net/tipc/tipc_bearer.c |   10 ++-
 net/tipc/tipc_bearer.h |    9 +++-
 net/tipc/tipc_link.c   |  152 ++++++++++++++++++++++++++++++++++-------------
 3 files changed, 124 insertions(+), 47 deletions(-)

diff --git a/net/tipc/tipc_bearer.c b/net/tipc/tipc_bearer.c
index 3cbca21..033eacd 100644
--- a/net/tipc/tipc_bearer.c
+++ b/net/tipc/tipc_bearer.c
@@ -69,10 +69,10 @@ static int media_name_valid(const char *name)
 }
 
 /**
- * media_find_name - locates specified media object by name
+ * tipc_media_find_name - locates specified media object by name
  */
 
-static struct tipc_media *media_find_name(const char *name)
+struct tipc_media *tipc_media_find_name(const char *name)
 {
        u32 i;
 
@@ -139,7 +139,7 @@ int  tipc_register_media(struct tipc_media *m_ptr)
        if (media_count >= MAX_MEDIA) {
                goto exit;
        }
-       if (media_find_id(m_ptr->media_id) || media_find_name(m_ptr->name)) {
+       if (media_find_id(m_ptr->media_id) || 
tipc_media_find_name(m_ptr->name)) {
                goto exit;
        }
 
@@ -574,7 +574,7 @@ int tipc_enable_bearer(const char *name, u32 disc_domain, 
u32 priority)
 
        write_lock_bh(&tipc_net_lock);
 
-       m_ptr = media_find_name(b_name.media_name);
+       m_ptr = tipc_media_find_name(b_name.media_name);
        if (!m_ptr) {
                warn("Bearer <%s> rejected, media <%s> not registered\n", name,
                     b_name.media_name);
@@ -628,6 +628,8 @@ restart:
        b_ptr->net_plane = bearer_id + 'A';
        b_ptr->active = 1;
        b_ptr->priority = priority;
+       b_ptr->tolerance = m_ptr->tolerance;
+       b_ptr->window = m_ptr->window;
        INIT_LIST_HEAD(&b_ptr->cong_links);
        INIT_LIST_HEAD(&b_ptr->links);
        INIT_LIST_HEAD(&b_ptr->disc_list);
diff --git a/net/tipc/tipc_bearer.h b/net/tipc/tipc_bearer.h
index 80aba31..aac5ba1 100644
--- a/net/tipc/tipc_bearer.h
+++ b/net/tipc/tipc_bearer.h
@@ -46,6 +46,8 @@
  * @publ: bearer information available to privileged users
  * @media: ptr to media structure associated with bearer
  * @priority: default link priority for bearer
+ * @window: default window size for bearer
+ * @tolerance: default link tolerance for bearer
  * @identity: array index of this bearer within TIPC bearer array
  * @disc_list: list of neighbor discovery objects
  * @links: list of non-congested links associated with bearer
@@ -60,12 +62,14 @@ struct bearer {
        struct tipc_bearer publ;
        struct tipc_media *media;
        u32 priority;
+       u32 window;
+       u32 tolerance;
        u32 identity;
        struct list_head disc_list;
        struct list_head links;
        struct list_head cong_links;
        u32 continue_count;
-       int active;
+       char active;
        char net_plane;
        struct node_map nodes;
 };
@@ -79,6 +83,8 @@ struct link;
 
 extern struct bearer *tipc_bearers;
 
+int tipc_media_set_priority(const char *name, u32 new_value);
+int tipc_media_set_window(const char *name, u32 new_value);
 void tipc_media_addr_printf(struct print_buf *pb, struct tipc_media_addr *a);
 struct sk_buff *tipc_media_get_names(void);
 
@@ -90,6 +96,7 @@ void tipc_bearer_remove_dest(struct bearer *b_ptr, u32 dest,
 void tipc_bearer_remove_discoverer(struct bearer *b_ptr, u32 dest);
 void tipc_bearer_schedule(struct bearer *b_ptr, struct link *l_ptr);
 struct bearer *tipc_bearer_find(const char *name);
+struct tipc_media *tipc_media_find_name(const char *name);
 int tipc_bearer_resolve_congestion(struct bearer *b_ptr, struct link *l_ptr);
 int tipc_bearer_congested(struct bearer *b_ptr, struct link *l_ptr);
 int tipc_bearer_init(void);
diff --git a/net/tipc/tipc_link.c b/net/tipc/tipc_link.c
index 79beeed..bf7a794 100644
--- a/net/tipc/tipc_link.c
+++ b/net/tipc/tipc_link.c
@@ -425,7 +425,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const 
u32 peer,
        memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr));
        l_ptr->checkpoint = 1;
        l_ptr->b_ptr = b_ptr;
-       link_set_supervision_props(l_ptr, b_ptr->media->tolerance);
+       link_set_supervision_props(l_ptr, b_ptr->tolerance);
        l_ptr->state = RESET_UNKNOWN;
        l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg;
        msg = l_ptr->pmsg;
@@ -435,7 +435,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const 
u32 peer,
        msg_set_bearer_id(msg, b_ptr->identity);
        strcpy((char *)msg_data(msg), if_name);
        l_ptr->priority = b_ptr->priority;
-       tipc_link_set_queue_limits(l_ptr, b_ptr->media->window);
+       tipc_link_set_queue_limits(l_ptr, b_ptr->window);
        link_init_max_pkt(l_ptr);
        l_ptr->next_out_no = 1;
        INIT_LIST_HEAD(&l_ptr->waiting_ports);
@@ -456,7 +456,7 @@ struct link *tipc_link_create(struct bearer *b_ptr, const 
u32 peer,
 
        dbg("tipc_link_create(): tolerance = %u,cont intv = %u, abort_limit = 
%u\n",
            l_ptr->tolerance, l_ptr->continuity_interval, l_ptr->abort_limit);
-       
+
        return l_ptr;
 }
 
@@ -2981,13 +2981,113 @@ static struct link *link_find_link(const char *name, 
struct node **node)
        return l_ptr;
 }
 
+
+/**
+ * value_is_valid -- check if priority/link tolerance/window is within range
+ *
+ * @cmd - value type (TIPC_CMD_SET_LINK_*)
+ * @new_value - the new value
+ *
+ * Returns true if value is within range.
+ */
+static bool value_is_valid(u16 cmd, u32 new_value)
+{
+       switch (cmd) {
+       case TIPC_CMD_SET_LINK_TOL:
+               if ((new_value >= TIPC_MIN_LINK_TOL) &&
+               (new_value <= TIPC_MAX_LINK_TOL))
+                       return true;
+               break;
+       case TIPC_CMD_SET_LINK_PRI:
+               if ((new_value >= TIPC_MIN_LINK_PRI) &&
+                       (new_value <= TIPC_MAX_LINK_PRI))
+                       return true;
+               break;
+       case TIPC_CMD_SET_LINK_WINDOW:
+               if ((new_value >= TIPC_MIN_LINK_WIN) &&
+                   (new_value <= TIPC_MAX_LINK_WIN))
+                       return true;
+       }
+       return false;
+}
+
+/**
+ * cmd_set_link_value - change priority/tolerance/window size of link, bearer 
or media
+ * @name - ptr to link, bearer or media name string
+ * @new_value - the new link priority or new bearer default link priority
+ * @cmd - which link/bearer property to set (TIPC_CMD_SET_LINK_*)
+ *
+ * Caller must hold 'tipc_net_lock' to ensure link/bearer are not deleted.
+ *
+ * Returns 0 if value updated and negative value on error.
+ * -EINVAL is returned if new_value is invalid.
+ */
+static int cmd_set_link_value(const char *name, u32 new_value, u16 cmd)
+{
+       struct node *node;
+       struct link *l_ptr;
+       struct bearer *b_ptr;
+       struct tipc_media *m_ptr;
+
+       l_ptr = link_find_link(name, &node);
+       if (l_ptr) {
+               switch (cmd) {
+               case TIPC_CMD_SET_LINK_TOL:
+                       link_set_supervision_props(l_ptr, new_value);
+                       break;
+               case TIPC_CMD_SET_LINK_PRI:
+                       l_ptr->priority = new_value;
+                       break;
+               case TIPC_CMD_SET_LINK_WINDOW:
+                       tipc_link_set_queue_limits(l_ptr, new_value);
+                       return 0;
+               default:
+                       return -EINVAL;
+               }
+               tipc_link_send_proto_msg(l_ptr, STATE_MSG,
+                                   0, 0, new_value, 0, 0, 0);
+               return 0;
+       }
+
+       b_ptr = tipc_bearer_find(name);
+       if (b_ptr) {
+               switch (cmd) {
+               case TIPC_CMD_SET_LINK_TOL:
+                       b_ptr->tolerance = new_value;
+                       return 0;
+               case TIPC_CMD_SET_LINK_PRI:
+                       b_ptr->priority = new_value;
+                       return 0;
+               case TIPC_CMD_SET_LINK_WINDOW:
+                       b_ptr->window = new_value;
+                       return 0;
+               }
+               return -EINVAL;
+       }
+
+       m_ptr = tipc_media_find_name(name);
+       if (!m_ptr)
+               return -ENODEV;
+       switch (cmd) {
+       case TIPC_CMD_SET_LINK_TOL:
+               m_ptr->tolerance = new_value;
+               return 0;
+       case TIPC_CMD_SET_LINK_PRI:
+               m_ptr->priority = new_value;
+               return 0;
+       case TIPC_CMD_SET_LINK_WINDOW:
+               m_ptr->window = new_value;
+               return 0;
+       }
+       return -EINVAL;
+}
+
+
 struct sk_buff *tipc_link_cmd_config(const void *req_tlv_area, int 
req_tlv_space, 
                                     u16 cmd)
 {
        struct tipc_link_config *args;
         u32 new_value;
-       struct link *l_ptr;
-       struct node *node;
         int res;
 
        if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_LINK_CONFIG))
@@ -2996,6 +3096,9 @@ struct sk_buff *tipc_link_cmd_config(const void 
*req_tlv_area, int req_tlv_space
        args = (struct tipc_link_config *)TLV_DATA(req_tlv_area);
        new_value = ntohl(args->value);
 
+       if (!value_is_valid(cmd, new_value))
+               return tipc_cfg_reply_error_string("cannot change, value 
invalid");
+
        if (!strcmp(args->name, tipc_bclink_name)) {
                if ((cmd == TIPC_CMD_SET_LINK_WINDOW) &&
                    (tipc_bclink_set_queue_limits(new_value) == 0))
@@ -3005,47 +3108,12 @@ struct sk_buff *tipc_link_cmd_config(const void 
*req_tlv_area, int req_tlv_space
        }
 
        read_lock_bh(&tipc_net_lock);
-       l_ptr = link_find_link(args->name, &node); 
-       if (!l_ptr) {
-               read_unlock_bh(&tipc_net_lock);
-               return tipc_cfg_reply_error_string("link not found");
-       }
 
-       node_lock(node);
-       res = -EINVAL;
-       switch (cmd) {
-       case TIPC_CMD_SET_LINK_TOL: 
-               if ((new_value >= TIPC_MIN_LINK_TOL) && 
-                   (new_value <= TIPC_MAX_LINK_TOL)) {
-                       link_set_supervision_props(l_ptr, new_value);
-                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
-                                           0, 0, new_value, 0, 0, 0);
-                       res = TIPC_OK;
-               }
-               break;
-       case TIPC_CMD_SET_LINK_PRI: 
-                if ((new_value >= TIPC_MIN_LINK_PRI) &&
-                    (new_value <= TIPC_MAX_LINK_PRI)) {
-                       l_ptr->priority = new_value;
-                       tipc_link_send_proto_msg(l_ptr, STATE_MSG, 
-                                                 0, 0, 0, new_value, 0, 0);
-                       res = TIPC_OK;
-               }
-               break;
-       case TIPC_CMD_SET_LINK_WINDOW: 
-               if ((new_value >= TIPC_MIN_LINK_WIN) && 
-                   (new_value <= TIPC_MAX_LINK_WIN)) {
-                       tipc_link_set_queue_limits(l_ptr, new_value);
-                       res = TIPC_OK;
-               }
-               break;
-       }
-       node_unlock(node);
+       res = cmd_set_link_value(args->name, new_value, cmd);
 
        read_unlock_bh(&tipc_net_lock);
        if (res)
-               return tipc_cfg_reply_error_string("cannot change link 
setting");
-
+               return tipc_cfg_reply_error_string("link or bearer not found");
        return tipc_cfg_reply_none();
 }
 

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
tipc-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to