|
@@ -43,13 +43,11 @@
|
|
|
#define REPLY_TRUNCATED "<truncated>\n"
|
|
|
|
|
|
static DEFINE_MUTEX(config_mutex);
|
|
|
-static struct tipc_server cfgsrv;
|
|
|
|
|
|
static const void *req_tlv_area; /* request message TLV area */
|
|
|
static int req_tlv_space; /* request message TLV area size */
|
|
|
static int rep_headroom; /* reply message headroom to use */
|
|
|
|
|
|
-
|
|
|
struct sk_buff *tipc_cfg_reply_alloc(int payload_size)
|
|
|
{
|
|
|
struct sk_buff *buf;
|
|
@@ -185,18 +183,6 @@ static struct sk_buff *cfg_set_own_addr(void)
|
|
|
return tipc_cfg_reply_none();
|
|
|
}
|
|
|
|
|
|
-static struct sk_buff *cfg_set_remote_mng(void)
|
|
|
-{
|
|
|
- u32 value;
|
|
|
-
|
|
|
- if (!TLV_CHECK(req_tlv_area, req_tlv_space, TIPC_TLV_UNSIGNED))
|
|
|
- return tipc_cfg_reply_error_string(TIPC_CFG_TLV_ERROR);
|
|
|
-
|
|
|
- value = ntohl(*(__be32 *)TLV_DATA(req_tlv_area));
|
|
|
- tipc_remote_management = (value != 0);
|
|
|
- return tipc_cfg_reply_none();
|
|
|
-}
|
|
|
-
|
|
|
static struct sk_buff *cfg_set_max_ports(void)
|
|
|
{
|
|
|
u32 value;
|
|
@@ -247,21 +233,10 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
|
|
|
/* Check command authorization */
|
|
|
if (likely(in_own_node(orig_node))) {
|
|
|
/* command is permitted */
|
|
|
- } else if (cmd >= 0x8000) {
|
|
|
+ } else {
|
|
|
rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
|
|
|
" (cannot be done remotely)");
|
|
|
goto exit;
|
|
|
- } else if (!tipc_remote_management) {
|
|
|
- rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NO_REMOTE);
|
|
|
- goto exit;
|
|
|
- } else if (cmd >= 0x4000) {
|
|
|
- u32 domain = 0;
|
|
|
-
|
|
|
- if ((tipc_nametbl_translate(TIPC_ZM_SRV, 0, &domain) == 0) ||
|
|
|
- (domain != orig_node)) {
|
|
|
- rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_ZONE_MSTR);
|
|
|
- goto exit;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
/* Call appropriate processing routine */
|
|
@@ -310,18 +285,12 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
|
|
|
case TIPC_CMD_SET_NODE_ADDR:
|
|
|
rep_tlv_buf = cfg_set_own_addr();
|
|
|
break;
|
|
|
- case TIPC_CMD_SET_REMOTE_MNG:
|
|
|
- rep_tlv_buf = cfg_set_remote_mng();
|
|
|
- break;
|
|
|
case TIPC_CMD_SET_MAX_PORTS:
|
|
|
rep_tlv_buf = cfg_set_max_ports();
|
|
|
break;
|
|
|
case TIPC_CMD_SET_NETID:
|
|
|
rep_tlv_buf = cfg_set_netid();
|
|
|
break;
|
|
|
- case TIPC_CMD_GET_REMOTE_MNG:
|
|
|
- rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_remote_management);
|
|
|
- break;
|
|
|
case TIPC_CMD_GET_MAX_PORTS:
|
|
|
rep_tlv_buf = tipc_cfg_reply_unsigned(tipc_max_ports);
|
|
|
break;
|
|
@@ -345,6 +314,8 @@ struct sk_buff *tipc_cfg_do_cmd(u32 orig_node, u16 cmd, const void *request_area
|
|
|
case TIPC_CMD_SET_MAX_PUBL:
|
|
|
case TIPC_CMD_GET_MAX_PUBL:
|
|
|
case TIPC_CMD_SET_LOG_SIZE:
|
|
|
+ case TIPC_CMD_SET_REMOTE_MNG:
|
|
|
+ case TIPC_CMD_GET_REMOTE_MNG:
|
|
|
case TIPC_CMD_DUMP_LOG:
|
|
|
rep_tlv_buf = tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED
|
|
|
" (obsolete command)");
|
|
@@ -369,75 +340,3 @@ exit:
|
|
|
mutex_unlock(&config_mutex);
|
|
|
return rep_tlv_buf;
|
|
|
}
|
|
|
-
|
|
|
-static void cfg_conn_msg_event(int conid, struct sockaddr_tipc *addr,
|
|
|
- void *usr_data, void *buf, size_t len)
|
|
|
-{
|
|
|
- struct tipc_cfg_msg_hdr *req_hdr;
|
|
|
- struct tipc_cfg_msg_hdr *rep_hdr;
|
|
|
- struct sk_buff *rep_buf;
|
|
|
-
|
|
|
- /* Validate configuration message header (ignore invalid message) */
|
|
|
- req_hdr = (struct tipc_cfg_msg_hdr *)buf;
|
|
|
- if ((len < sizeof(*req_hdr)) ||
|
|
|
- (len != TCM_ALIGN(ntohl(req_hdr->tcm_len))) ||
|
|
|
- (ntohs(req_hdr->tcm_flags) != TCM_F_REQUEST)) {
|
|
|
- pr_warn("Invalid configuration message discarded\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* Generate reply for request (if can't, return request) */
|
|
|
- rep_buf = tipc_cfg_do_cmd(addr->addr.id.node, ntohs(req_hdr->tcm_type),
|
|
|
- buf + sizeof(*req_hdr),
|
|
|
- len - sizeof(*req_hdr),
|
|
|
- BUF_HEADROOM + MAX_H_SIZE + sizeof(*rep_hdr));
|
|
|
- if (rep_buf) {
|
|
|
- skb_push(rep_buf, sizeof(*rep_hdr));
|
|
|
- rep_hdr = (struct tipc_cfg_msg_hdr *)rep_buf->data;
|
|
|
- memcpy(rep_hdr, req_hdr, sizeof(*rep_hdr));
|
|
|
- rep_hdr->tcm_len = htonl(rep_buf->len);
|
|
|
- rep_hdr->tcm_flags &= htons(~TCM_F_REQUEST);
|
|
|
- tipc_conn_sendmsg(&cfgsrv, conid, addr, rep_buf->data,
|
|
|
- rep_buf->len);
|
|
|
- kfree_skb(rep_buf);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static struct sockaddr_tipc cfgsrv_addr __read_mostly = {
|
|
|
- .family = AF_TIPC,
|
|
|
- .addrtype = TIPC_ADDR_NAMESEQ,
|
|
|
- .addr.nameseq.type = TIPC_CFG_SRV,
|
|
|
- .addr.nameseq.lower = 0,
|
|
|
- .addr.nameseq.upper = 0,
|
|
|
- .scope = TIPC_ZONE_SCOPE
|
|
|
-};
|
|
|
-
|
|
|
-static struct tipc_server cfgsrv __read_mostly = {
|
|
|
- .saddr = &cfgsrv_addr,
|
|
|
- .imp = TIPC_CRITICAL_IMPORTANCE,
|
|
|
- .type = SOCK_RDM,
|
|
|
- .max_rcvbuf_size = 64 * 1024,
|
|
|
- .name = "cfg_server",
|
|
|
- .tipc_conn_recvmsg = cfg_conn_msg_event,
|
|
|
- .tipc_conn_new = NULL,
|
|
|
- .tipc_conn_shutdown = NULL
|
|
|
-};
|
|
|
-
|
|
|
-int tipc_cfg_init(void)
|
|
|
-{
|
|
|
- return tipc_server_start(&cfgsrv);
|
|
|
-}
|
|
|
-
|
|
|
-void tipc_cfg_reinit(void)
|
|
|
-{
|
|
|
- tipc_server_stop(&cfgsrv);
|
|
|
-
|
|
|
- cfgsrv_addr.addr.nameseq.lower = tipc_own_addr;
|
|
|
- cfgsrv_addr.addr.nameseq.upper = tipc_own_addr;
|
|
|
- tipc_server_start(&cfgsrv);
|
|
|
-}
|
|
|
-
|
|
|
-void tipc_cfg_stop(void)
|
|
|
-{
|
|
|
- tipc_server_stop(&cfgsrv);
|
|
|
-}
|