@@ -30,6 +30,7 @@ static void syntax(char *argv[])
30
30
fprintf (stderr , "\tann <local-ip> id <local-id> token <token> [port <local-port>] [dev <name>]\n" );
31
31
fprintf (stderr , "\trem id <local-id> token <token>\n" );
32
32
fprintf (stderr , "\tcsf lip <local-ip> lid <local-id> rip <remote-ip> rport <remote-port> token <token>\n" );
33
+ fprintf (stderr , "\tdsf lip <local-ip> lport <local-port> rip <remote-ip> rport <remote-port> token <token>\n" );
33
34
fprintf (stderr , "\tdel <id> [<ip>]\n" );
34
35
fprintf (stderr , "\tget <id>\n" );
35
36
fprintf (stderr , "\tset [<ip>] [id <nr>] flags [no]backup|[no]fullmesh [port <nr>]\n" );
@@ -174,6 +175,118 @@ static int resolve_mptcp_pm_netlink(int fd)
174
175
return genl_parse_getfamily ((void * )data );
175
176
}
176
177
178
+ int dsf (int fd , int pm_family , int argc , char * argv [])
179
+ {
180
+ char data [NLMSG_ALIGN (sizeof (struct nlmsghdr )) +
181
+ NLMSG_ALIGN (sizeof (struct genlmsghdr )) +
182
+ 1024 ];
183
+ struct rtattr * rta , * addr ;
184
+ u_int16_t family , port ;
185
+ struct nlmsghdr * nh ;
186
+ u_int32_t token ;
187
+ int addr_start ;
188
+ int off = 0 ;
189
+ int arg ;
190
+
191
+ const char * params [5 ];
192
+
193
+ memset (params , 0 , 5 * sizeof (const char * ));
194
+
195
+ memset (data , 0 , sizeof (data ));
196
+ nh = (void * )data ;
197
+ off = init_genl_req (data , pm_family , MPTCP_PM_CMD_SUBFLOW_DESTROY ,
198
+ MPTCP_PM_VER );
199
+
200
+ if (argc < 12 )
201
+ syntax (argv );
202
+
203
+ /* Params recorded in this order:
204
+ * <local-ip>, <local-port>, <remote-ip>, <remote-port>, <token>
205
+ */
206
+ for (arg = 2 ; arg < argc ; arg ++ ) {
207
+ if (!strcmp (argv [arg ], "lip" )) {
208
+ if (++ arg >= argc )
209
+ error (1 , 0 , " missing local IP" );
210
+
211
+ params [0 ] = argv [arg ];
212
+ } else if (!strcmp (argv [arg ], "lport" )) {
213
+ if (++ arg >= argc )
214
+ error (1 , 0 , " missing local port" );
215
+
216
+ params [1 ] = argv [arg ];
217
+ } else if (!strcmp (argv [arg ], "rip" )) {
218
+ if (++ arg >= argc )
219
+ error (1 , 0 , " missing remote IP" );
220
+
221
+ params [2 ] = argv [arg ];
222
+ } else if (!strcmp (argv [arg ], "rport" )) {
223
+ if (++ arg >= argc )
224
+ error (1 , 0 , " missing remote port" );
225
+
226
+ params [3 ] = argv [arg ];
227
+ } else if (!strcmp (argv [arg ], "token" )) {
228
+ if (++ arg >= argc )
229
+ error (1 , 0 , " missing token" );
230
+
231
+ params [4 ] = argv [arg ];
232
+ } else
233
+ error (1 , 0 , "unknown keyword %s" , argv [arg ]);
234
+ }
235
+
236
+ for (arg = 0 ; arg < 4 ; arg = arg + 2 ) {
237
+ /* addr header */
238
+ addr_start = off ;
239
+ addr = (void * )(data + off );
240
+ addr -> rta_type = NLA_F_NESTED |
241
+ ((arg == 0 ) ? MPTCP_PM_ATTR_ADDR : MPTCP_PM_ATTR_ADDR_REMOTE );
242
+ addr -> rta_len = RTA_LENGTH (0 );
243
+ off += NLMSG_ALIGN (addr -> rta_len );
244
+
245
+ /* addr data */
246
+ rta = (void * )(data + off );
247
+ if (inet_pton (AF_INET , params [arg ], RTA_DATA (rta ))) {
248
+ family = AF_INET ;
249
+ rta -> rta_type = MPTCP_PM_ADDR_ATTR_ADDR4 ;
250
+ rta -> rta_len = RTA_LENGTH (4 );
251
+ } else if (inet_pton (AF_INET6 , params [arg ], RTA_DATA (rta ))) {
252
+ family = AF_INET6 ;
253
+ rta -> rta_type = MPTCP_PM_ADDR_ATTR_ADDR6 ;
254
+ rta -> rta_len = RTA_LENGTH (16 );
255
+ } else
256
+ error (1 , errno , "can't parse ip %s" , params [arg ]);
257
+ off += NLMSG_ALIGN (rta -> rta_len );
258
+
259
+ /* family */
260
+ rta = (void * )(data + off );
261
+ rta -> rta_type = MPTCP_PM_ADDR_ATTR_FAMILY ;
262
+ rta -> rta_len = RTA_LENGTH (2 );
263
+ memcpy (RTA_DATA (rta ), & family , 2 );
264
+ off += NLMSG_ALIGN (rta -> rta_len );
265
+
266
+ /* port */
267
+ port = atoi (params [arg + 1 ]);
268
+ rta = (void * )(data + off );
269
+ rta -> rta_type = MPTCP_PM_ADDR_ATTR_PORT ;
270
+ rta -> rta_len = RTA_LENGTH (2 );
271
+ memcpy (RTA_DATA (rta ), & port , 2 );
272
+ off += NLMSG_ALIGN (rta -> rta_len );
273
+
274
+ addr -> rta_len = off - addr_start ;
275
+ }
276
+
277
+ /* token */
278
+ token = atoi (params [4 ]);
279
+ rta = (void * )(data + off );
280
+ rta -> rta_type = MPTCP_PM_ATTR_TOKEN ;
281
+ rta -> rta_len = RTA_LENGTH (4 );
282
+ memcpy (RTA_DATA (rta ), & token , 4 );
283
+ off += NLMSG_ALIGN (rta -> rta_len );
284
+
285
+ do_nl_req (fd , nh , off , 0 );
286
+
287
+ return 0 ;
288
+ }
289
+
177
290
int csf (int fd , int pm_family , int argc , char * argv [])
178
291
{
179
292
char data [NLMSG_ALIGN (sizeof (struct nlmsghdr )) +
@@ -1098,6 +1211,8 @@ int main(int argc, char *argv[])
1098
1211
return remove_addr (fd , pm_family , argc , argv );
1099
1212
else if (!strcmp (argv [1 ], "csf" ))
1100
1213
return csf (fd , pm_family , argc , argv );
1214
+ else if (!strcmp (argv [1 ], "dsf" ))
1215
+ return dsf (fd , pm_family , argc , argv );
1101
1216
else if (!strcmp (argv [1 ], "del" ))
1102
1217
return del_addr (fd , pm_family , argc , argv );
1103
1218
else if (!strcmp (argv [1 ], "flush" ))
0 commit comments