checkpid $pid_file || exit 1
for b in $MSTP_BRIDGES; do
if [ "$bridge" == "$b" ]; then
- exit 0;
+ exec /sbin/mstpctl notify-daemon-that-stp-is-on $bridge
fi
done
exit 1 ;;
stop)
- exit 0 ;;
+ exec /sbin/mstpctl notify-daemon-that-stp-is-off $bridge
+ ;;
*)
echo "Unknown action:" $2
echo "Usage: bridge-stp <bridge> {start|stop}"
}
}
-static int stp_enabled(bridge_t * br)
+static bool stp_enabled(bridge_t * br)
{
char path[40 + IFNAMSIZ];
sprintf(path, "/sys/class/net/%s/bridge/stp_state", br->sysdeps.name);
return enabled == 2; /* ie user mode STP */
}
-static void set_br_up(bridge_t * br, bool up)
+static void set_br_up(bridge_t * br, bool up, bool stp_up)
{
- int stp_up = stp_enabled(br);
INFO("%s was %s stp was %s", br->sysdeps.name,
br->sysdeps.up ? "up" : "down", br->sysdeps.stp_up ? "up" : "down");
INFO("Set bridge %s %s stp %s" , br->sysdeps.name,
}
int br_flags = get_flags(br->sysdeps.name);
if(br_flags >= 0)
- set_br_up(br, !!(br_flags & IFF_UP));
+ set_br_up(br, !!(br_flags & IFF_UP), stp_enabled(br));
}
if(br)
return -1;
}
}
- set_br_up(br, up);
+ set_br_up(br, up, stp_enabled(br));
}
}
}
CTL_CHECK_BRIDGE;
return MSTP_IN_set_all_fids2mstids(br, fids2mstids) ? 0 : -1;
}
+
+int CTL_stp_mode_notification(int br_index, bool on)
+{
+ int br_flags;
+ CTL_CHECK_BRIDGE;
+ if(0 > (br_flags = get_flags(br->sysdeps.name)))
+ return br_flags;
+ set_br_up(br, !!(br_flags & IFF_UP), on);
+ return 0;
+}
#define MSTP_SERVER_SOCK_NAME ".mstp_server"
+/* Commands sent from bridge-stp script needs this flag */
+#define RESPONSE_FIRST_HANDLE_LATER 0x10000
+
/* COMMANDS */
#define CTL_DECLARE(name) \
int CTL_ ## name name ## _ARGS
#define set_fids2mstids_CALL (in->br_index, in->fids2mstids)
CTL_DECLARE(set_fids2mstids);
+/* stp_mode_notification */
+#define CMD_CODE_stp_mode_notification (122 | RESPONSE_FIRST_HANDLE_LATER)
+#define stp_mode_notification_ARGS (int br_index, bool on)
+struct stp_mode_notification_IN
+{
+ int br_index;
+ bool on;
+};
+struct stp_mode_notification_OUT
+{
+};
+#define stp_mode_notification_COPY_IN ({ in->br_index = br_index; \
+ in->on = on; })
+#define stp_mode_notification_COPY_OUT ({ (void)0; })
+#define stp_mode_notification_CALL (in->br_index, in->on)
+CTL_DECLARE(stp_mode_notification);
+
/* General case part in ctl command server switch */
#define SERVER_MESSAGE_CASE(name) \
case CMD_CODE_ ## name : do \
return CTL_set_fid2mstid(br_index, fid, mstid);
}
+static int cmd_stp_mode_notification(int argc, char *const *argv, bool on)
+{
+ int br_index = get_index(argv[1], "bridge");
+ if(0 > br_index)
+ return br_index;
+ return CTL_stp_mode_notification(br_index, on);
+}
+
struct command
{
int nargs;
argv += optind;
if(NULL == (cmd = command_lookup(argv[0])))
{
+ /* Two special commands not intended for interactive use */
+ if(!strcmp(argv[0], "notify-daemon-that-stp-is-on"))
+ return cmd_stp_mode_notification(argc, argv, true);
+ if(!strcmp(argv[0], "notify-daemon-that-stp-is-off"))
+ return cmd_stp_mode_notification(argc, argv, false);
+
fprintf(stderr, "never heard of command [%s]\n", argv[0]);
goto help;
}
CLIENT_SIDE_FUNCTION(set_fid2mstid)
CLIENT_SIDE_FUNCTION(set_vids2fids)
CLIENT_SIDE_FUNCTION(set_fids2mstids)
+CLIENT_SIDE_FUNCTION(stp_mode_notification)
/*********************** Logging *********************/
SERVER_MESSAGE_CASE(set_fid2mstid);
SERVER_MESSAGE_CASE(set_vids2fids);
SERVER_MESSAGE_CASE(set_fids2mstids);
+ SERVER_MESSAGE_CASE(stp_mode_notification);
default:
ERROR("CTL: Unknown command %d", cmd);
msg_log_offset = 0;
ctl_in_handler = 1;
- mhdr.res = handle_message(mhdr.cmd, msg_inbuf, mhdr.lin,
- msg_outbuf, mhdr.lout);
+ if(!(mhdr.cmd & RESPONSE_FIRST_HANDLE_LATER))
+ mhdr.res = handle_message(mhdr.cmd, msg_inbuf, mhdr.lin,
+ msg_outbuf, mhdr.lout);
+ else
+ mhdr.res = 0;
ctl_in_handler = 0;
if(0 > mhdr.res)
("CTL: Couldn't send full response, sent %d bytes instead of %zd.",
l, sizeof(mhdr) + mhdr.lout + mhdr.llog);
}
+
+ if(mhdr.cmd & RESPONSE_FIRST_HANDLE_LATER)
+ handle_message(mhdr.cmd, msg_inbuf, mhdr.lin, msg_outbuf, mhdr.lout);
}
static struct epoll_event_handler ctl_handler = {0};