1
2
3
4
5
6
7
8
9
10
11
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15#include <errno.h>
16
17#include <linux/tipc_netlink.h>
18#include <linux/tipc.h>
19#include <linux/genetlink.h>
20#include <libmnl/libmnl.h>
21
22#include "cmdl.h"
23#include "msg.h"
24#include "misc.h"
25#include "peer.h"
26
27static int cmd_peer_rm_addr(struct nlmsghdr *nlh, const struct cmd *cmd,
28 struct cmdl *cmdl, void *data)
29{
30 char *str;
31 uint32_t addr;
32 struct nlattr *nest;
33 char buf[MNL_SOCKET_BUFFER_SIZE];
34
35 if ((cmdl->argc != cmdl->optind + 1) || help_flag) {
36 fprintf(stderr, "Usage: %s peer remove address ADDRESS\n",
37 cmdl->argv[0]);
38 return -EINVAL;
39 }
40
41 str = shift_cmdl(cmdl);
42
43
44 addr = str2addr(str);
45 if (!addr)
46 addr = atoi(str);
47 if (!addr)
48 return -1;
49
50 if (!(nlh = msg_init(buf, TIPC_NL_PEER_REMOVE))) {
51 fprintf(stderr, "error, message initialisation failed\n");
52 return -1;
53 }
54
55 nest = mnl_attr_nest_start(nlh, TIPC_NLA_NET);
56 mnl_attr_put_u32(nlh, TIPC_NLA_NET_ADDR, addr);
57 mnl_attr_nest_end(nlh, nest);
58
59 return msg_doit(nlh, NULL, NULL);
60}
61
62static int cmd_peer_rm_nodeid(struct nlmsghdr *nlh, const struct cmd *cmd,
63 struct cmdl *cmdl, void *data)
64{
65 char buf[MNL_SOCKET_BUFFER_SIZE];
66 __u8 id[16] = {0,};
67 __u64 *w0 = (__u64 *)&id[0];
68 __u64 *w1 = (__u64 *)&id[8];
69 struct nlattr *nest;
70 char *str;
71
72 if (cmdl->argc != cmdl->optind + 1) {
73 fprintf(stderr, "Usage: %s peer remove identity NODEID\n",
74 cmdl->argv[0]);
75 return -EINVAL;
76 }
77
78 str = shift_cmdl(cmdl);
79 if (str2nodeid(str, id)) {
80 fprintf(stderr, "Invalid node identity\n");
81 return -EINVAL;
82 }
83
84 nlh = msg_init(buf, TIPC_NL_PEER_REMOVE);
85 if (!nlh) {
86 fprintf(stderr, "error, message initialisation failed\n");
87 return -1;
88 }
89
90 nest = mnl_attr_nest_start(nlh, TIPC_NLA_NET);
91 mnl_attr_put_u64(nlh, TIPC_NLA_NET_NODEID, *w0);
92 mnl_attr_put_u64(nlh, TIPC_NLA_NET_NODEID_W1, *w1);
93 mnl_attr_nest_end(nlh, nest);
94
95 return msg_doit(nlh, NULL, NULL);
96}
97
98static void cmd_peer_rm_help(struct cmdl *cmdl)
99{
100 fprintf(stderr, "Usage: %s peer remove PROPERTY\n\n"
101 "PROPERTIES\n"
102 " identity NODEID - Remove peer node identity\n",
103 cmdl->argv[0]);
104}
105
106static void cmd_peer_rm_addr_help(struct cmdl *cmdl)
107{
108 fprintf(stderr, "Usage: %s peer remove address ADDRESS\n",
109 cmdl->argv[0]);
110}
111
112static void cmd_peer_rm_nodeid_help(struct cmdl *cmdl)
113{
114 fprintf(stderr, "Usage: %s peer remove identity NODEID\n",
115 cmdl->argv[0]);
116}
117
118static int cmd_peer_rm(struct nlmsghdr *nlh, const struct cmd *cmd,
119 struct cmdl *cmdl, void *data)
120{
121 const struct cmd cmds[] = {
122 { "address", cmd_peer_rm_addr, cmd_peer_rm_addr_help },
123 { "identity", cmd_peer_rm_nodeid, cmd_peer_rm_nodeid_help },
124 { NULL }
125 };
126
127 return run_cmd(nlh, cmd, cmds, cmdl, NULL);
128}
129
130void cmd_peer_help(struct cmdl *cmdl)
131{
132 fprintf(stderr,
133 "Usage: %s peer COMMAND [ARGS] ...\n\n"
134 "COMMANDS\n"
135 " remove - Remove an offline peer node\n",
136 cmdl->argv[0]);
137}
138
139int cmd_peer(struct nlmsghdr *nlh, const struct cmd *cmd, struct cmdl *cmdl,
140 void *data)
141{
142 const struct cmd cmds[] = {
143 { "remove", cmd_peer_rm, cmd_peer_rm_help },
144 { NULL }
145 };
146
147 return run_cmd(nlh, cmd, cmds, cmdl, NULL);
148}
149