25
25
#ifdef CONFIG_RTNETLINK
26
26
#include <linux/rtnetlink.h>
27
27
#include <linux/if_bridge.h>
28
+ #include <linux/neighbour.h>
28
29
#endif
29
30
#include "qemu.h"
30
31
#include "user-internals.h"
31
32
#include "fd-trans.h"
32
33
#include "signal-common.h"
33
34
35
+ #define NDM_RTA (r ) ((struct rtattr*)(((char*)(r)) + \
36
+ NLMSG_ALIGN(sizeof(struct ndmsg))))
37
+
38
+ enum {
39
+ QEMU_IFA_UNSPEC ,
40
+ QEMU_IFA_ADDRESS ,
41
+ QEMU_IFA_LOCAL ,
42
+ QEMU_IFA_LABEL ,
43
+ QEMU_IFA_BROADCAST ,
44
+ QEMU_IFA_ANYCAST ,
45
+ QEMU_IFA_CACHEINFO ,
46
+ QEMU_IFA_MULTICAST ,
47
+ QEMU_IFA_FLAGS ,
48
+ QEMU_IFA_RT_PRIORITY ,
49
+ QEMU_IFA_TARGET_NETNSID ,
50
+ QEMU_IFA_PROTO ,
51
+ QEMU__IFA__MAX ,
52
+ };
53
+
34
54
enum {
35
55
QEMU_IFLA_BR_UNSPEC ,
36
56
QEMU_IFLA_BR_FORWARD_DELAY ,
@@ -141,6 +161,14 @@ enum {
141
161
QEMU_IFLA_PROTO_DOWN_REASON ,
142
162
QEMU_IFLA_PARENT_DEV_NAME ,
143
163
QEMU_IFLA_PARENT_DEV_BUS_NAME ,
164
+ QEMU_IFLA_GRO_MAX_SIZE ,
165
+ QEMU_IFLA_TSO_MAX_SIZE ,
166
+ QEMU_IFLA_TSO_MAX_SEGS ,
167
+ QEMU_IFLA_ALLMULTI ,
168
+ QEMU_IFLA_DEVLINK_PORT ,
169
+ QEMU_IFLA_GSO_IPV4_MAX_SIZE ,
170
+ QEMU_IFLA_GRO_IPV4_MAX_SIZE ,
171
+ QEMU_IFLA_DPLL_PIN ,
144
172
QEMU___IFLA_MAX
145
173
};
146
174
@@ -982,6 +1010,22 @@ static abi_long host_to_target_data_vfinfo_nlattr(struct nlattr *nlattr,
982
1010
return 0 ;
983
1011
}
984
1012
1013
+ static abi_long host_to_target_data_prop_nlattr (struct nlattr * nlattr ,
1014
+ void * context )
1015
+ {
1016
+ switch (nlattr -> nla_type ) {
1017
+ /* string */
1018
+ case QEMU_IFLA_ALT_IFNAME :
1019
+ break ;
1020
+ default :
1021
+ qemu_log_mask (LOG_UNIMP , "Unknown host PROP type: %d\n" ,
1022
+ nlattr -> nla_type );
1023
+ break ;
1024
+ }
1025
+ return 0 ;
1026
+ }
1027
+
1028
+
985
1029
static abi_long host_to_target_data_link_rtattr (struct rtattr * rtattr )
986
1030
{
987
1031
uint32_t * u32 ;
@@ -990,7 +1034,7 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
990
1034
struct rtnl_link_ifmap * map ;
991
1035
struct linkinfo_context li_context ;
992
1036
993
- switch (rtattr -> rta_type ) {
1037
+ switch (rtattr -> rta_type & NLA_TYPE_MASK ) {
994
1038
/* binary stream */
995
1039
case QEMU_IFLA_ADDRESS :
996
1040
case QEMU_IFLA_BROADCAST :
@@ -1028,6 +1072,12 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
1028
1072
case QEMU_IFLA_CARRIER_DOWN_COUNT :
1029
1073
case QEMU_IFLA_MIN_MTU :
1030
1074
case QEMU_IFLA_MAX_MTU :
1075
+ case QEMU_IFLA_GRO_MAX_SIZE :
1076
+ case QEMU_IFLA_TSO_MAX_SIZE :
1077
+ case QEMU_IFLA_TSO_MAX_SEGS :
1078
+ case QEMU_IFLA_ALLMULTI :
1079
+ case QEMU_IFLA_GSO_IPV4_MAX_SIZE :
1080
+ case QEMU_IFLA_GRO_IPV4_MAX_SIZE :
1031
1081
u32 = RTA_DATA (rtattr );
1032
1082
* u32 = tswap32 (* u32 );
1033
1083
break ;
@@ -1123,6 +1173,10 @@ static abi_long host_to_target_data_link_rtattr(struct rtattr *rtattr)
1123
1173
return host_to_target_for_each_nlattr (RTA_DATA (rtattr ), rtattr -> rta_len ,
1124
1174
NULL ,
1125
1175
host_to_target_data_vfinfo_nlattr );
1176
+ case QEMU_IFLA_PROP_LIST :
1177
+ return host_to_target_for_each_nlattr (RTA_DATA (rtattr ), rtattr -> rta_len ,
1178
+ NULL ,
1179
+ host_to_target_data_prop_nlattr );
1126
1180
default :
1127
1181
qemu_log_mask (LOG_UNIMP , "Unknown host QEMU_IFLA type: %d\n" ,
1128
1182
rtattr -> rta_type );
@@ -1138,20 +1192,21 @@ static abi_long host_to_target_data_addr_rtattr(struct rtattr *rtattr)
1138
1192
1139
1193
switch (rtattr -> rta_type ) {
1140
1194
/* binary: depends on family type */
1141
- case IFA_ADDRESS :
1142
- case IFA_LOCAL :
1195
+ case QEMU_IFA_ADDRESS :
1196
+ case QEMU_IFA_LOCAL :
1197
+ case QEMU_IFA_PROTO :
1143
1198
break ;
1144
1199
/* string */
1145
- case IFA_LABEL :
1200
+ case QEMU_IFA_LABEL :
1146
1201
break ;
1147
1202
/* u32 */
1148
- case IFA_FLAGS :
1149
- case IFA_BROADCAST :
1203
+ case QEMU_IFA_FLAGS :
1204
+ case QEMU_IFA_BROADCAST :
1150
1205
u32 = RTA_DATA (rtattr );
1151
1206
* u32 = tswap32 (* u32 );
1152
1207
break ;
1153
1208
/* struct ifa_cacheinfo */
1154
- case IFA_CACHEINFO :
1209
+ case QEMU_IFA_CACHEINFO :
1155
1210
ci = RTA_DATA (rtattr );
1156
1211
ci -> ifa_prefered = tswap32 (ci -> ifa_prefered );
1157
1212
ci -> ifa_valid = tswap32 (ci -> ifa_valid );
@@ -1209,6 +1264,35 @@ static abi_long host_to_target_data_route_rtattr(struct rtattr *rtattr)
1209
1264
return 0 ;
1210
1265
}
1211
1266
1267
+ static abi_long host_to_target_data_neigh_rtattr (struct rtattr * rtattr )
1268
+ {
1269
+ struct nda_cacheinfo * ndac ;
1270
+ uint32_t * u32 ;
1271
+
1272
+ switch (rtattr -> rta_type ) {
1273
+ case NDA_UNSPEC :
1274
+ case NDA_DST :
1275
+ case NDA_LLADDR :
1276
+ break ;
1277
+ case NDA_PROBES :
1278
+ u32 = RTA_DATA (rtattr );
1279
+ * u32 = tswap32 (* u32 );
1280
+ break ;
1281
+ case NDA_CACHEINFO :
1282
+ ndac = RTA_DATA (rtattr );
1283
+ ndac -> ndm_confirmed = tswap32 (ndac -> ndm_confirmed );
1284
+ ndac -> ndm_used = tswap32 (ndac -> ndm_used );
1285
+ ndac -> ndm_updated = tswap32 (ndac -> ndm_updated );
1286
+ ndac -> ndm_refcnt = tswap32 (ndac -> ndm_refcnt );
1287
+ break ;
1288
+ default :
1289
+ qemu_log_mask (LOG_UNIMP , "Unknown host to target NEIGH type: %d\n" ,
1290
+ rtattr -> rta_type );
1291
+ break ;
1292
+ }
1293
+ return 0 ;
1294
+ }
1295
+
1212
1296
static abi_long host_to_target_link_rtattr (struct rtattr * rtattr ,
1213
1297
uint32_t rtattr_len )
1214
1298
{
@@ -1230,12 +1314,20 @@ static abi_long host_to_target_route_rtattr(struct rtattr *rtattr,
1230
1314
host_to_target_data_route_rtattr );
1231
1315
}
1232
1316
1317
+ static abi_long host_to_target_neigh_rtattr (struct rtattr * rtattr ,
1318
+ uint32_t rtattr_len )
1319
+ {
1320
+ return host_to_target_for_each_rtattr (rtattr , rtattr_len ,
1321
+ host_to_target_data_neigh_rtattr );
1322
+ }
1323
+
1233
1324
static abi_long host_to_target_data_route (struct nlmsghdr * nlh )
1234
1325
{
1235
1326
uint32_t nlmsg_len ;
1236
1327
struct ifinfomsg * ifi ;
1237
1328
struct ifaddrmsg * ifa ;
1238
1329
struct rtmsg * rtm ;
1330
+ struct ndmsg * ndm ;
1239
1331
1240
1332
nlmsg_len = nlh -> nlmsg_len ;
1241
1333
switch (nlh -> nlmsg_type ) {
@@ -1262,6 +1354,17 @@ static abi_long host_to_target_data_route(struct nlmsghdr *nlh)
1262
1354
nlmsg_len - NLMSG_LENGTH (sizeof (* ifa )));
1263
1355
}
1264
1356
break ;
1357
+ case RTM_NEWNEIGH :
1358
+ case RTM_DELNEIGH :
1359
+ case RTM_GETNEIGH :
1360
+ if (nlh -> nlmsg_len >= NLMSG_LENGTH (sizeof (* ndm ))) {
1361
+ ndm = NLMSG_DATA (nlh );
1362
+ ndm -> ndm_ifindex = tswap32 (ndm -> ndm_ifindex );
1363
+ ndm -> ndm_state = tswap16 (ndm -> ndm_state );
1364
+ host_to_target_neigh_rtattr (NDM_RTA (ndm ),
1365
+ nlmsg_len - NLMSG_LENGTH (sizeof (* ndm )));
1366
+ }
1367
+ break ;
1265
1368
case RTM_NEWROUTE :
1266
1369
case RTM_DELROUTE :
1267
1370
case RTM_GETROUTE :
@@ -1398,8 +1501,8 @@ static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr)
1398
1501
{
1399
1502
switch (rtattr -> rta_type ) {
1400
1503
/* binary: depends on family type */
1401
- case IFA_LOCAL :
1402
- case IFA_ADDRESS :
1504
+ case QEMU_IFA_LOCAL :
1505
+ case QEMU_IFA_ADDRESS :
1403
1506
break ;
1404
1507
default :
1405
1508
qemu_log_mask (LOG_UNIMP , "Unknown target IFA type: %d\n" ,
@@ -1409,6 +1512,35 @@ static abi_long target_to_host_data_addr_rtattr(struct rtattr *rtattr)
1409
1512
return 0 ;
1410
1513
}
1411
1514
1515
+ static abi_long target_to_host_data_neigh_rtattr (struct rtattr * rtattr )
1516
+ {
1517
+ struct nda_cacheinfo * ndac ;
1518
+ uint32_t * u32 ;
1519
+
1520
+ switch (rtattr -> rta_type ) {
1521
+ case NDA_UNSPEC :
1522
+ case NDA_DST :
1523
+ case NDA_LLADDR :
1524
+ break ;
1525
+ case NDA_PROBES :
1526
+ u32 = RTA_DATA (rtattr );
1527
+ * u32 = tswap32 (* u32 );
1528
+ break ;
1529
+ case NDA_CACHEINFO :
1530
+ ndac = RTA_DATA (rtattr );
1531
+ ndac -> ndm_confirmed = tswap32 (ndac -> ndm_confirmed );
1532
+ ndac -> ndm_used = tswap32 (ndac -> ndm_used );
1533
+ ndac -> ndm_updated = tswap32 (ndac -> ndm_updated );
1534
+ ndac -> ndm_refcnt = tswap32 (ndac -> ndm_refcnt );
1535
+ break ;
1536
+ default :
1537
+ qemu_log_mask (LOG_UNIMP , "Unknown target NEIGH type: %d\n" ,
1538
+ rtattr -> rta_type );
1539
+ break ;
1540
+ }
1541
+ return 0 ;
1542
+ }
1543
+
1412
1544
static abi_long target_to_host_data_route_rtattr (struct rtattr * rtattr )
1413
1545
{
1414
1546
uint32_t * u32 ;
@@ -1447,6 +1579,13 @@ static void target_to_host_addr_rtattr(struct rtattr *rtattr,
1447
1579
target_to_host_data_addr_rtattr );
1448
1580
}
1449
1581
1582
+ static void target_to_host_neigh_rtattr (struct rtattr * rtattr ,
1583
+ uint32_t rtattr_len )
1584
+ {
1585
+ target_to_host_for_each_rtattr (rtattr , rtattr_len ,
1586
+ target_to_host_data_neigh_rtattr );
1587
+ }
1588
+
1450
1589
static void target_to_host_route_rtattr (struct rtattr * rtattr ,
1451
1590
uint32_t rtattr_len )
1452
1591
{
@@ -1459,6 +1598,7 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
1459
1598
struct ifinfomsg * ifi ;
1460
1599
struct ifaddrmsg * ifa ;
1461
1600
struct rtmsg * rtm ;
1601
+ struct ndmsg * ndm ;
1462
1602
1463
1603
switch (nlh -> nlmsg_type ) {
1464
1604
case RTM_NEWLINK :
@@ -1485,6 +1625,17 @@ static abi_long target_to_host_data_route(struct nlmsghdr *nlh)
1485
1625
NLMSG_LENGTH (sizeof (* ifa )));
1486
1626
}
1487
1627
break ;
1628
+ case RTM_NEWNEIGH :
1629
+ case RTM_DELNEIGH :
1630
+ case RTM_GETNEIGH :
1631
+ if (nlh -> nlmsg_len >= NLMSG_LENGTH (sizeof (* ndm ))) {
1632
+ ndm = NLMSG_DATA (nlh );
1633
+ ndm -> ndm_ifindex = tswap32 (ndm -> ndm_ifindex );
1634
+ ndm -> ndm_state = tswap16 (ndm -> ndm_state );
1635
+ target_to_host_neigh_rtattr (NDM_RTA (ndm ), nlh -> nlmsg_len -
1636
+ NLMSG_LENGTH (sizeof (* ndm )));
1637
+ }
1638
+ break ;
1488
1639
case RTM_NEWROUTE :
1489
1640
case RTM_DELROUTE :
1490
1641
case RTM_GETROUTE :
0 commit comments