@@ -1142,11 +1142,12 @@ static int mptcp_pm_family_to_addr(int family)
1142
1142
return MPTCP_PM_ADDR_ATTR_ADDR4 ;
1143
1143
}
1144
1144
1145
- static int mptcp_pm_parse_addr (struct nlattr * attr , struct genl_info * info ,
1146
- bool require_family ,
1147
- struct mptcp_pm_addr_entry * entry )
1145
+ static int mptcp_pm_parse_pm_addr_attr (struct nlattr * tb [],
1146
+ const struct nlattr * attr ,
1147
+ struct genl_info * info ,
1148
+ struct mptcp_addr_info * addr ,
1149
+ bool require_family )
1148
1150
{
1149
- struct nlattr * tb [MPTCP_PM_ADDR_ATTR_MAX + 1 ];
1150
1151
int err , addr_addr ;
1151
1152
1152
1153
if (!attr ) {
@@ -1160,50 +1161,67 @@ static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info,
1160
1161
if (err )
1161
1162
return err ;
1162
1163
1163
- memset (entry , 0 , sizeof (* entry ));
1164
+ if (tb [MPTCP_PM_ADDR_ATTR_ID ])
1165
+ addr -> id = nla_get_u8 (tb [MPTCP_PM_ADDR_ATTR_ID ]);
1166
+
1164
1167
if (!tb [MPTCP_PM_ADDR_ATTR_FAMILY ]) {
1165
1168
if (!require_family )
1166
- goto skip_family ;
1169
+ return err ;
1167
1170
1168
1171
NL_SET_ERR_MSG_ATTR (info -> extack , attr ,
1169
1172
"missing family" );
1170
1173
return - EINVAL ;
1171
1174
}
1172
1175
1173
- entry -> addr . family = nla_get_u16 (tb [MPTCP_PM_ADDR_ATTR_FAMILY ]);
1174
- if (entry -> addr . family != AF_INET
1176
+ addr -> family = nla_get_u16 (tb [MPTCP_PM_ADDR_ATTR_FAMILY ]);
1177
+ if (addr -> family != AF_INET
1175
1178
#if IS_ENABLED (CONFIG_MPTCP_IPV6 )
1176
- && entry -> addr . family != AF_INET6
1179
+ && addr -> family != AF_INET6
1177
1180
#endif
1178
1181
) {
1179
1182
NL_SET_ERR_MSG_ATTR (info -> extack , attr ,
1180
1183
"unknown address family" );
1181
1184
return - EINVAL ;
1182
1185
}
1183
- addr_addr = mptcp_pm_family_to_addr (entry -> addr . family );
1186
+ addr_addr = mptcp_pm_family_to_addr (addr -> family );
1184
1187
if (!tb [addr_addr ]) {
1185
1188
NL_SET_ERR_MSG_ATTR (info -> extack , attr ,
1186
1189
"missing address data" );
1187
1190
return - EINVAL ;
1188
1191
}
1189
1192
1190
1193
#if IS_ENABLED (CONFIG_MPTCP_IPV6 )
1191
- if (entry -> addr . family == AF_INET6 )
1192
- entry -> addr . addr6 = nla_get_in6_addr (tb [addr_addr ]);
1194
+ if (addr -> family == AF_INET6 )
1195
+ addr -> addr6 = nla_get_in6_addr (tb [addr_addr ]);
1193
1196
else
1194
1197
#endif
1195
- entry -> addr .addr .s_addr = nla_get_in_addr (tb [addr_addr ]);
1198
+ addr -> addr .s_addr = nla_get_in_addr (tb [addr_addr ]);
1199
+
1200
+ if (tb [MPTCP_PM_ADDR_ATTR_PORT ])
1201
+ addr -> port = htons (nla_get_u16 (tb [MPTCP_PM_ADDR_ATTR_PORT ]));
1202
+
1203
+ return err ;
1204
+ }
1205
+
1206
+ static int mptcp_pm_parse_entry (struct nlattr * attr , struct genl_info * info ,
1207
+ bool require_family ,
1208
+ struct mptcp_pm_addr_entry * entry )
1209
+ {
1210
+ struct nlattr * tb [MPTCP_PM_ADDR_ATTR_MAX + 1 ];
1211
+ int err ;
1212
+
1213
+ memset (entry , 0 , sizeof (* entry ));
1214
+
1215
+ err = mptcp_pm_parse_pm_addr_attr (tb , attr , info , & entry -> addr , require_family );
1216
+ if (err )
1217
+ return err ;
1196
1218
1197
- skip_family :
1198
1219
if (tb [MPTCP_PM_ADDR_ATTR_IF_IDX ]) {
1199
1220
u32 val = nla_get_s32 (tb [MPTCP_PM_ADDR_ATTR_IF_IDX ]);
1200
1221
1201
1222
entry -> ifindex = val ;
1202
1223
}
1203
1224
1204
- if (tb [MPTCP_PM_ADDR_ATTR_ID ])
1205
- entry -> addr .id = nla_get_u8 (tb [MPTCP_PM_ADDR_ATTR_ID ]);
1206
-
1207
1225
if (tb [MPTCP_PM_ADDR_ATTR_FLAGS ])
1208
1226
entry -> flags = nla_get_u32 (tb [MPTCP_PM_ADDR_ATTR_FLAGS ]);
1209
1227
@@ -1251,7 +1269,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb, struct genl_info *info)
1251
1269
struct mptcp_pm_addr_entry addr , * entry ;
1252
1270
int ret ;
1253
1271
1254
- ret = mptcp_pm_parse_addr (attr , info , true, & addr );
1272
+ ret = mptcp_pm_parse_entry (attr , info , true, & addr );
1255
1273
if (ret < 0 )
1256
1274
return ret ;
1257
1275
@@ -1445,7 +1463,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb, struct genl_info *info)
1445
1463
unsigned int addr_max ;
1446
1464
int ret ;
1447
1465
1448
- ret = mptcp_pm_parse_addr (attr , info , false, & addr );
1466
+ ret = mptcp_pm_parse_entry (attr , info , false, & addr );
1449
1467
if (ret < 0 )
1450
1468
return ret ;
1451
1469
@@ -1619,7 +1637,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb, struct genl_info *info)
1619
1637
void * reply ;
1620
1638
int ret ;
1621
1639
1622
- ret = mptcp_pm_parse_addr (attr , info , false, & addr );
1640
+ ret = mptcp_pm_parse_entry (attr , info , false, & addr );
1623
1641
if (ret < 0 )
1624
1642
return ret ;
1625
1643
@@ -1830,7 +1848,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *info)
1830
1848
u8 bkup = 0 , lookup_by_id = 0 ;
1831
1849
int ret ;
1832
1850
1833
- ret = mptcp_pm_parse_addr (attr , info , false, & addr );
1851
+ ret = mptcp_pm_parse_entry (attr , info , false, & addr );
1834
1852
if (ret < 0 )
1835
1853
return ret ;
1836
1854
0 commit comments