775
897
nl_msg_end_nested(a, tun_key_ofs);
901
odp_mask_attr_is_exact(const struct nlattr *ma)
903
bool is_exact = false;
904
enum ovs_key_attr attr = nl_attr_type(ma);
906
if (attr == OVS_KEY_ATTR_TUNNEL) {
907
/* XXX this is a hack for now. Should change
908
* the exact match dection to per field
909
* instead of per attribute.
911
struct flow_tnl tun_mask;
912
memset(&tun_mask, 0, sizeof tun_mask);
913
odp_tun_key_from_attr(ma, &tun_mask);
914
if (tun_mask.flags == (FLOW_TNL_F_KEY
915
| FLOW_TNL_F_DONT_FRAGMENT
916
| FLOW_TNL_F_CSUM)) {
917
/* The flags are exact match, check the remaining fields. */
918
tun_mask.flags = 0xffff;
919
is_exact = is_all_ones((uint8_t *)&tun_mask,
920
offsetof(struct flow_tnl, ip_ttl));
923
is_exact = is_all_ones(nl_attr_get(ma), nl_attr_get_size(ma));
779
format_odp_key_attr(const struct nlattr *a, struct ds *ds)
931
format_odp_key_attr(const struct nlattr *a, const struct nlattr *ma,
781
const struct ovs_key_ethernet *eth_key;
782
const struct ovs_key_ipv4 *ipv4_key;
783
const struct ovs_key_ipv6 *ipv6_key;
784
const struct ovs_key_tcp *tcp_key;
785
const struct ovs_key_udp *udp_key;
786
const struct ovs_key_icmp *icmp_key;
787
const struct ovs_key_icmpv6 *icmpv6_key;
788
const struct ovs_key_arp *arp_key;
789
const struct ovs_key_nd *nd_key;
790
934
struct flow_tnl tun_key;
791
935
enum ovs_key_attr attr = nl_attr_type(a);
936
char namebuf[OVS_KEY_ATTR_BUFSIZE];
792
937
int expected_len;
794
ds_put_cstr(ds, ovs_key_attr_to_string(attr));
795
expected_len = odp_flow_key_attr_len(nl_attr_type(a));
796
if (expected_len != -2 && nl_attr_get_size(a) != expected_len) {
797
ds_put_format(ds, "(bad length %zu, expected %d)",
799
odp_flow_key_attr_len(nl_attr_type(a)));
800
format_generic_odp_key(a, ds);
940
is_exact = ma ? odp_mask_attr_is_exact(ma) : true;
942
ds_put_cstr(ds, ovs_key_attr_to_string(attr, namebuf, sizeof namebuf));
945
expected_len = odp_flow_key_attr_len(nl_attr_type(a));
946
if (expected_len != -2) {
947
bool bad_key_len = nl_attr_get_size(a) != expected_len;
948
bool bad_mask_len = ma && nl_attr_get_size(a) != expected_len;
950
if (bad_key_len || bad_mask_len) {
952
ds_put_format(ds, "(bad key length %zu, expected %d)(",
954
odp_flow_key_attr_len(nl_attr_type(a)));
956
format_generic_odp_key(a, ds);
958
ds_put_char(ds, '/');
959
ds_put_format(ds, "(bad mask length %zu, expected %d)(",
960
nl_attr_get_size(ma),
961
odp_flow_key_attr_len(nl_attr_type(ma)));
963
format_generic_odp_key(ma, ds);
964
ds_put_char(ds, ')');
970
ds_put_char(ds, '(');
805
972
case OVS_KEY_ATTR_ENCAP:
806
ds_put_cstr(ds, "(");
807
if (nl_attr_get_size(a)) {
808
odp_flow_key_format(nl_attr_get(a), nl_attr_get_size(a), ds);
973
if (ma && nl_attr_get_size(ma) && nl_attr_get_size(a)) {
974
odp_flow_format(nl_attr_get(a), nl_attr_get_size(a),
975
nl_attr_get(ma), nl_attr_get_size(ma), ds);
976
} else if (nl_attr_get_size(a)) {
977
odp_flow_format(nl_attr_get(a), nl_attr_get_size(a), NULL, 0, ds);
810
ds_put_char(ds, ')');
813
981
case OVS_KEY_ATTR_PRIORITY:
814
ds_put_format(ds, "(%#"PRIx32")", nl_attr_get_u32(a));
817
982
case OVS_KEY_ATTR_SKB_MARK:
818
ds_put_format(ds, "(%#"PRIx32")", nl_attr_get_u32(a));
983
ds_put_format(ds, "%#"PRIx32, nl_attr_get_u32(a));
985
ds_put_format(ds, "/%#"PRIx32, nl_attr_get_u32(ma));
821
989
case OVS_KEY_ATTR_TUNNEL:
822
990
memset(&tun_key, 0, sizeof tun_key);
823
if (tun_key_from_attr(a, &tun_key) == ODP_FIT_ERROR) {
824
ds_put_format(ds, "(error)");
991
if (odp_tun_key_from_attr(a, &tun_key) == ODP_FIT_ERROR) {
992
ds_put_format(ds, "error");
993
} else if (!is_exact) {
994
struct flow_tnl tun_mask;
996
memset(&tun_mask, 0, sizeof tun_mask);
997
odp_tun_key_from_attr(ma, &tun_mask);
998
ds_put_format(ds, "tun_id=%#"PRIx64"/%#"PRIx64
999
",src="IP_FMT"/"IP_FMT",dst="IP_FMT"/"IP_FMT
1000
",tos=%#"PRIx8"/%#"PRIx8",ttl=%"PRIu8"/%#"PRIx8
1002
ntohll(tun_key.tun_id), ntohll(tun_mask.tun_id),
1003
IP_ARGS(tun_key.ip_src), IP_ARGS(tun_mask.ip_src),
1004
IP_ARGS(tun_key.ip_dst), IP_ARGS(tun_mask.ip_dst),
1005
tun_key.ip_tos, tun_mask.ip_tos,
1006
tun_key.ip_ttl, tun_mask.ip_ttl);
1008
format_flags(ds, flow_tun_flag_to_string, tun_key.flags, ',');
1010
/* XXX This code is correct, but enabling it would break the unit
1011
test. Disable it for now until the input parser is fixed.
1013
ds_put_char(ds, '/');
1014
format_flags(ds, flow_tun_flag_to_string, tun_mask.flags, ',');
1016
ds_put_char(ds, ')');
826
ds_put_format(ds, "(tun_id=0x%"PRIx64",src="IP_FMT",dst="IP_FMT","
1018
ds_put_format(ds, "tun_id=0x%"PRIx64",src="IP_FMT",dst="IP_FMT","
827
1019
"tos=0x%"PRIx8",ttl=%"PRIu8",flags(",
828
1020
ntohll(tun_key.tun_id),
829
1021
IP_ARGS(tun_key.ip_src),
830
1022
IP_ARGS(tun_key.ip_dst),
831
1023
tun_key.ip_tos, tun_key.ip_ttl);
833
format_flags(ds, flow_tun_flag_to_string,
834
(uint32_t) tun_key.flags, ',');
835
ds_put_format(ds, "))");
1025
format_flags(ds, flow_tun_flag_to_string, tun_key.flags, ',');
1026
ds_put_char(ds, ')');
839
1030
case OVS_KEY_ATTR_IN_PORT:
840
ds_put_format(ds, "(%"PRIu32")", nl_attr_get_u32(a));
1031
ds_put_format(ds, "%"PRIu32, nl_attr_get_u32(a));
1033
ds_put_format(ds, "/%#"PRIx32, nl_attr_get_u32(ma));
843
1037
case OVS_KEY_ATTR_ETHERNET:
844
eth_key = nl_attr_get(a);
845
ds_put_format(ds, "(src="ETH_ADDR_FMT",dst="ETH_ADDR_FMT")",
846
ETH_ADDR_ARGS(eth_key->eth_src),
847
ETH_ADDR_ARGS(eth_key->eth_dst));
1039
const struct ovs_key_ethernet *eth_mask = nl_attr_get(ma);
1040
const struct ovs_key_ethernet *eth_key = nl_attr_get(a);
1042
ds_put_format(ds, "src="ETH_ADDR_FMT"/"ETH_ADDR_FMT
1043
",dst="ETH_ADDR_FMT"/"ETH_ADDR_FMT,
1044
ETH_ADDR_ARGS(eth_key->eth_src),
1045
ETH_ADDR_ARGS(eth_mask->eth_src),
1046
ETH_ADDR_ARGS(eth_key->eth_dst),
1047
ETH_ADDR_ARGS(eth_mask->eth_dst));
1049
const struct ovs_key_ethernet *eth_key = nl_attr_get(a);
1051
ds_put_format(ds, "src="ETH_ADDR_FMT",dst="ETH_ADDR_FMT,
1052
ETH_ADDR_ARGS(eth_key->eth_src),
1053
ETH_ADDR_ARGS(eth_key->eth_dst));
850
1057
case OVS_KEY_ATTR_VLAN:
851
ds_put_char(ds, '(');
852
format_vlan_tci(ds, nl_attr_get_be16(a));
853
ds_put_char(ds, ')');
1059
ovs_be16 vlan_tci = nl_attr_get_be16(a);
1061
ovs_be16 mask = nl_attr_get_be16(ma);
1062
ds_put_format(ds, "vid=%"PRIu16"/0x%"PRIx16",pcp=%d/0x%x,cfi=%d/%d",
1063
vlan_tci_to_vid(vlan_tci),
1064
vlan_tci_to_vid(mask),
1065
vlan_tci_to_pcp(vlan_tci),
1066
vlan_tci_to_pcp(mask),
1067
vlan_tci_to_cfi(vlan_tci),
1068
vlan_tci_to_cfi(mask));
1070
format_vlan_tci(ds, vlan_tci);
1075
case OVS_KEY_ATTR_MPLS: {
1076
const struct ovs_key_mpls *mpls_key = nl_attr_get(a);
1077
const struct ovs_key_mpls *mpls_mask = NULL;
1079
mpls_mask = nl_attr_get(ma);
1081
format_mpls(ds, mpls_key, mpls_mask);
856
1085
case OVS_KEY_ATTR_ETHERTYPE:
857
ds_put_format(ds, "(0x%04"PRIx16")",
858
ntohs(nl_attr_get_be16(a)));
1086
ds_put_format(ds, "0x%04"PRIx16, ntohs(nl_attr_get_be16(a)));
1088
ds_put_format(ds, "/0x%04"PRIx16, ntohs(nl_attr_get_be16(ma)));
861
1092
case OVS_KEY_ATTR_IPV4:
862
ipv4_key = nl_attr_get(a);
863
ds_put_format(ds, "(src="IP_FMT",dst="IP_FMT",proto=%"PRIu8
864
",tos=%#"PRIx8",ttl=%"PRIu8",frag=%s)",
865
IP_ARGS(ipv4_key->ipv4_src),
866
IP_ARGS(ipv4_key->ipv4_dst),
867
ipv4_key->ipv4_proto, ipv4_key->ipv4_tos,
869
ovs_frag_type_to_string(ipv4_key->ipv4_frag));
872
case OVS_KEY_ATTR_IPV6: {
873
char src_str[INET6_ADDRSTRLEN];
874
char dst_str[INET6_ADDRSTRLEN];
876
ipv6_key = nl_attr_get(a);
877
inet_ntop(AF_INET6, ipv6_key->ipv6_src, src_str, sizeof src_str);
878
inet_ntop(AF_INET6, ipv6_key->ipv6_dst, dst_str, sizeof dst_str);
880
ds_put_format(ds, "(src=%s,dst=%s,label=%#"PRIx32",proto=%"PRIu8
881
",tclass=%#"PRIx8",hlimit=%"PRIu8",frag=%s)",
882
src_str, dst_str, ntohl(ipv6_key->ipv6_label),
883
ipv6_key->ipv6_proto, ipv6_key->ipv6_tclass,
884
ipv6_key->ipv6_hlimit,
885
ovs_frag_type_to_string(ipv6_key->ipv6_frag));
1094
const struct ovs_key_ipv4 *ipv4_key = nl_attr_get(a);
1095
const struct ovs_key_ipv4 *ipv4_mask = nl_attr_get(ma);
1097
ds_put_format(ds, "src="IP_FMT"/"IP_FMT",dst="IP_FMT"/"IP_FMT
1098
",proto=%"PRIu8"/%#"PRIx8",tos=%#"PRIx8"/%#"PRIx8
1099
",ttl=%"PRIu8"/%#"PRIx8",frag=%s/%#"PRIx8,
1100
IP_ARGS(ipv4_key->ipv4_src),
1101
IP_ARGS(ipv4_mask->ipv4_src),
1102
IP_ARGS(ipv4_key->ipv4_dst),
1103
IP_ARGS(ipv4_mask->ipv4_dst),
1104
ipv4_key->ipv4_proto, ipv4_mask->ipv4_proto,
1105
ipv4_key->ipv4_tos, ipv4_mask->ipv4_tos,
1106
ipv4_key->ipv4_ttl, ipv4_mask->ipv4_ttl,
1107
ovs_frag_type_to_string(ipv4_key->ipv4_frag),
1108
ipv4_mask->ipv4_frag);
1110
const struct ovs_key_ipv4 *ipv4_key = nl_attr_get(a);
1112
ds_put_format(ds, "src="IP_FMT",dst="IP_FMT",proto=%"PRIu8
1113
",tos=%#"PRIx8",ttl=%"PRIu8",frag=%s",
1114
IP_ARGS(ipv4_key->ipv4_src),
1115
IP_ARGS(ipv4_key->ipv4_dst),
1116
ipv4_key->ipv4_proto, ipv4_key->ipv4_tos,
1118
ovs_frag_type_to_string(ipv4_key->ipv4_frag));
1122
case OVS_KEY_ATTR_IPV6:
1124
const struct ovs_key_ipv6 *ipv6_key, *ipv6_mask;
1125
char src_str[INET6_ADDRSTRLEN];
1126
char dst_str[INET6_ADDRSTRLEN];
1127
char src_mask[INET6_ADDRSTRLEN];
1128
char dst_mask[INET6_ADDRSTRLEN];
1130
ipv6_key = nl_attr_get(a);
1131
inet_ntop(AF_INET6, ipv6_key->ipv6_src, src_str, sizeof src_str);
1132
inet_ntop(AF_INET6, ipv6_key->ipv6_dst, dst_str, sizeof dst_str);
1134
ipv6_mask = nl_attr_get(ma);
1135
inet_ntop(AF_INET6, ipv6_mask->ipv6_src, src_mask, sizeof src_mask);
1136
inet_ntop(AF_INET6, ipv6_mask->ipv6_dst, dst_mask, sizeof dst_mask);
1138
ds_put_format(ds, "src=%s/%s,dst=%s/%s,label=%#"PRIx32"/%#"PRIx32
1139
",proto=%"PRIu8"/%#"PRIx8",tclass=%#"PRIx8"/%#"PRIx8
1140
",hlimit=%"PRIu8"/%#"PRIx8",frag=%s/%#"PRIx8,
1141
src_str, src_mask, dst_str, dst_mask,
1142
ntohl(ipv6_key->ipv6_label),
1143
ntohl(ipv6_mask->ipv6_label),
1144
ipv6_key->ipv6_proto, ipv6_mask->ipv6_proto,
1145
ipv6_key->ipv6_tclass, ipv6_mask->ipv6_tclass,
1146
ipv6_key->ipv6_hlimit, ipv6_mask->ipv6_hlimit,
1147
ovs_frag_type_to_string(ipv6_key->ipv6_frag),
1148
ipv6_mask->ipv6_frag);
1150
const struct ovs_key_ipv6 *ipv6_key;
1151
char src_str[INET6_ADDRSTRLEN];
1152
char dst_str[INET6_ADDRSTRLEN];
1154
ipv6_key = nl_attr_get(a);
1155
inet_ntop(AF_INET6, ipv6_key->ipv6_src, src_str, sizeof src_str);
1156
inet_ntop(AF_INET6, ipv6_key->ipv6_dst, dst_str, sizeof dst_str);
1158
ds_put_format(ds, "src=%s,dst=%s,label=%#"PRIx32",proto=%"PRIu8
1159
",tclass=%#"PRIx8",hlimit=%"PRIu8",frag=%s",
1160
src_str, dst_str, ntohl(ipv6_key->ipv6_label),
1161
ipv6_key->ipv6_proto, ipv6_key->ipv6_tclass,
1162
ipv6_key->ipv6_hlimit,
1163
ovs_frag_type_to_string(ipv6_key->ipv6_frag));
889
1167
case OVS_KEY_ATTR_TCP:
890
tcp_key = nl_attr_get(a);
891
ds_put_format(ds, "(src=%"PRIu16",dst=%"PRIu16")",
892
ntohs(tcp_key->tcp_src), ntohs(tcp_key->tcp_dst));
1169
const struct ovs_key_tcp *tcp_mask = nl_attr_get(ma);
1170
const struct ovs_key_tcp *tcp_key = nl_attr_get(a);
1172
ds_put_format(ds, "src=%"PRIu16"/%#"PRIx16
1173
",dst=%"PRIu16"/%#"PRIx16,
1174
ntohs(tcp_key->tcp_src), ntohs(tcp_mask->tcp_src),
1175
ntohs(tcp_key->tcp_dst), ntohs(tcp_mask->tcp_dst));
1177
const struct ovs_key_tcp *tcp_key = nl_attr_get(a);
1179
ds_put_format(ds, "src=%"PRIu16",dst=%"PRIu16,
1180
ntohs(tcp_key->tcp_src), ntohs(tcp_key->tcp_dst));
895
1184
case OVS_KEY_ATTR_UDP:
896
udp_key = nl_attr_get(a);
897
ds_put_format(ds, "(src=%"PRIu16",dst=%"PRIu16")",
898
ntohs(udp_key->udp_src), ntohs(udp_key->udp_dst));
1186
const struct ovs_key_udp *udp_mask = nl_attr_get(ma);
1187
const struct ovs_key_udp *udp_key = nl_attr_get(a);
1189
ds_put_format(ds, "src=%"PRIu16"/%#"PRIx16
1190
",dst=%"PRIu16"/%#"PRIx16,
1191
ntohs(udp_key->udp_src), ntohs(udp_mask->udp_src),
1192
ntohs(udp_key->udp_dst), ntohs(udp_mask->udp_dst));
1194
const struct ovs_key_udp *udp_key = nl_attr_get(a);
1196
ds_put_format(ds, "src=%"PRIu16",dst=%"PRIu16,
1197
ntohs(udp_key->udp_src), ntohs(udp_key->udp_dst));
901
1201
case OVS_KEY_ATTR_ICMP:
902
icmp_key = nl_attr_get(a);
903
ds_put_format(ds, "(type=%"PRIu8",code=%"PRIu8")",
904
icmp_key->icmp_type, icmp_key->icmp_code);
1203
const struct ovs_key_icmp *icmp_mask = nl_attr_get(ma);
1204
const struct ovs_key_icmp *icmp_key = nl_attr_get(a);
1206
ds_put_format(ds, "type=%"PRIu8"/%#"PRIx8",code=%"PRIu8"/%#"PRIx8,
1207
icmp_key->icmp_type, icmp_mask->icmp_type,
1208
icmp_key->icmp_code, icmp_mask->icmp_code);
1210
const struct ovs_key_icmp *icmp_key = nl_attr_get(a);
1212
ds_put_format(ds, "type=%"PRIu8",code=%"PRIu8,
1213
icmp_key->icmp_type, icmp_key->icmp_code);
907
1217
case OVS_KEY_ATTR_ICMPV6:
908
icmpv6_key = nl_attr_get(a);
909
ds_put_format(ds, "(type=%"PRIu8",code=%"PRIu8")",
910
icmpv6_key->icmpv6_type, icmpv6_key->icmpv6_code);
1219
const struct ovs_key_icmpv6 *icmpv6_mask = nl_attr_get(ma);
1220
const struct ovs_key_icmpv6 *icmpv6_key = nl_attr_get(a);
1222
ds_put_format(ds, "type=%"PRIu8"/%#"PRIx8",code=%"PRIu8"/%#"PRIx8,
1223
icmpv6_key->icmpv6_type, icmpv6_mask->icmpv6_type,
1224
icmpv6_key->icmpv6_code, icmpv6_mask->icmpv6_code);
1226
const struct ovs_key_icmpv6 *icmpv6_key = nl_attr_get(a);
1228
ds_put_format(ds, "type=%"PRIu8",code=%"PRIu8,
1229
icmpv6_key->icmpv6_type, icmpv6_key->icmpv6_code);
913
1233
case OVS_KEY_ATTR_ARP:
914
arp_key = nl_attr_get(a);
915
ds_put_format(ds, "(sip="IP_FMT",tip="IP_FMT",op=%"PRIu16","
916
"sha="ETH_ADDR_FMT",tha="ETH_ADDR_FMT")",
917
IP_ARGS(arp_key->arp_sip), IP_ARGS(arp_key->arp_tip),
918
ntohs(arp_key->arp_op), ETH_ADDR_ARGS(arp_key->arp_sha),
919
ETH_ADDR_ARGS(arp_key->arp_tha));
1235
const struct ovs_key_arp *arp_mask = nl_attr_get(ma);
1236
const struct ovs_key_arp *arp_key = nl_attr_get(a);
1238
ds_put_format(ds, "sip="IP_FMT"/"IP_FMT",tip="IP_FMT"/"IP_FMT
1239
",op=%"PRIu16"/%#"PRIx16
1240
",sha="ETH_ADDR_FMT"/"ETH_ADDR_FMT
1241
",tha="ETH_ADDR_FMT"/"ETH_ADDR_FMT,
1242
IP_ARGS(arp_key->arp_sip),
1243
IP_ARGS(arp_mask->arp_sip),
1244
IP_ARGS(arp_key->arp_tip),
1245
IP_ARGS(arp_mask->arp_tip),
1246
ntohs(arp_key->arp_op), ntohs(arp_mask->arp_op),
1247
ETH_ADDR_ARGS(arp_key->arp_sha),
1248
ETH_ADDR_ARGS(arp_mask->arp_sha),
1249
ETH_ADDR_ARGS(arp_key->arp_tha),
1250
ETH_ADDR_ARGS(arp_mask->arp_tha));
1252
const struct ovs_key_arp *arp_key = nl_attr_get(a);
1254
ds_put_format(ds, "sip="IP_FMT",tip="IP_FMT",op=%"PRIu16","
1255
"sha="ETH_ADDR_FMT",tha="ETH_ADDR_FMT,
1256
IP_ARGS(arp_key->arp_sip), IP_ARGS(arp_key->arp_tip),
1257
ntohs(arp_key->arp_op),
1258
ETH_ADDR_ARGS(arp_key->arp_sha),
1259
ETH_ADDR_ARGS(arp_key->arp_tha));
922
1263
case OVS_KEY_ATTR_ND: {
1264
const struct ovs_key_nd *nd_key, *nd_mask = NULL;
923
1265
char target[INET6_ADDRSTRLEN];
925
1267
nd_key = nl_attr_get(a);
1269
nd_mask = nl_attr_get(ma);
926
1272
inet_ntop(AF_INET6, nd_key->nd_target, target, sizeof target);
1273
ds_put_format(ds, "target=%s", target);
1275
inet_ntop(AF_INET6, nd_mask->nd_target, target, sizeof target);
1276
ds_put_format(ds, "/%s", target);
928
ds_put_format(ds, "(target=%s", target);
929
1279
if (!eth_addr_is_zero(nd_key->nd_sll)) {
930
1280
ds_put_format(ds, ",sll="ETH_ADDR_FMT,
931
1281
ETH_ADDR_ARGS(nd_key->nd_sll));
1283
ds_put_format(ds, "/"ETH_ADDR_FMT,
1284
ETH_ADDR_ARGS(nd_mask->nd_sll));
933
1287
if (!eth_addr_is_zero(nd_key->nd_tll)) {
934
1288
ds_put_format(ds, ",tll="ETH_ADDR_FMT,
935
1289
ETH_ADDR_ARGS(nd_key->nd_tll));
1291
ds_put_format(ds, "/"ETH_ADDR_FMT,
1292
ETH_ADDR_ARGS(nd_mask->nd_tll));
937
ds_put_char(ds, ')');
1101
1629
node = simap_find_len(port_names, name, name_len);
1103
1631
nl_msg_put_u32(key, OVS_KEY_ATTR_IN_PORT, node->data);
1634
nl_msg_put_u32(mask, OVS_KEY_ATTR_IN_PORT, UINT32_MAX);
1104
1636
return 8 + name_len + 1;
1109
1641
struct ovs_key_ethernet eth_key;
1642
struct ovs_key_ethernet eth_key_mask;
1645
if (mask && sscanf(s,
1646
"eth(src="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT","
1647
"dst="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
1648
ETH_ADDR_SCAN_ARGS(eth_key.eth_src),
1649
ETH_ADDR_SCAN_ARGS(eth_key_mask.eth_src),
1650
ETH_ADDR_SCAN_ARGS(eth_key.eth_dst),
1651
ETH_ADDR_SCAN_ARGS(eth_key_mask.eth_dst), &n) > 0 && n > 0) {
1653
nl_msg_put_unspec(key, OVS_KEY_ATTR_ETHERNET,
1654
ð_key, sizeof eth_key);
1655
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ETHERNET,
1656
ð_key_mask, sizeof eth_key_mask);
1658
} else if (sscanf(s,
1113
1659
"eth(src="ETH_ADDR_SCAN_FMT",dst="ETH_ADDR_SCAN_FMT")%n",
1114
1660
ETH_ADDR_SCAN_ARGS(eth_key.eth_src),
1115
1661
ETH_ADDR_SCAN_ARGS(eth_key.eth_dst), &n) > 0 && n > 0) {
1116
1662
nl_msg_put_unspec(key, OVS_KEY_ATTR_ETHERNET,
1117
1663
ð_key, sizeof eth_key);
1666
memset(ð_key, 0xff, sizeof eth_key);
1667
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ETHERNET,
1668
ð_key, sizeof eth_key);
1675
uint16_t vid, vid_mask;
1128
if ((sscanf(s, "vlan(vid=%"SCNi16",pcp=%i)%n", &vid, &pcp, &n) > 0
1130
nl_msg_put_be16(key, OVS_KEY_ATTR_VLAN,
1131
htons((vid << VLAN_VID_SHIFT) |
1132
(pcp << VLAN_PCP_SHIFT) |
1680
if (mask && (sscanf(s, "vlan(vid=%"SCNi16"/%"SCNi16",pcp=%i/%i)%n",
1681
&vid, &vid_mask, &pcp, &pcp_mask, &n) > 0 && n > 0)) {
1682
nl_msg_put_be16(key, OVS_KEY_ATTR_VLAN,
1683
htons((vid << VLAN_VID_SHIFT) |
1684
(pcp << VLAN_PCP_SHIFT) |
1686
nl_msg_put_be16(mask, OVS_KEY_ATTR_VLAN,
1687
htons((vid_mask << VLAN_VID_SHIFT) |
1688
(pcp_mask << VLAN_PCP_SHIFT) |
1689
(1 << VLAN_CFI_SHIFT)));
1691
} else if ((sscanf(s, "vlan(vid=%"SCNi16",pcp=%i)%n",
1692
&vid, &pcp, &n) > 0 && n > 0)) {
1693
nl_msg_put_be16(key, OVS_KEY_ATTR_VLAN,
1694
htons((vid << VLAN_VID_SHIFT) |
1695
(pcp << VLAN_PCP_SHIFT) |
1698
nl_msg_put_be16(mask, OVS_KEY_ATTR_VLAN, htons(UINT16_MAX));
1701
} else if (mask && (sscanf(s, "vlan(vid=%"SCNi16"/%"SCNi16",pcp=%i/%i,cfi=%i/%i)%n",
1702
&vid, &vid_mask, &pcp, &pcp_mask, &cfi, &cfi_mask, &n) > 0 && n > 0)) {
1703
nl_msg_put_be16(key, OVS_KEY_ATTR_VLAN,
1704
htons((vid << VLAN_VID_SHIFT) |
1705
(pcp << VLAN_PCP_SHIFT) |
1706
(cfi ? VLAN_CFI : 0)));
1707
nl_msg_put_be16(mask, OVS_KEY_ATTR_VLAN,
1708
htons((vid_mask << VLAN_VID_SHIFT) |
1709
(pcp_mask << VLAN_PCP_SHIFT) |
1710
(cfi_mask << VLAN_CFI_SHIFT)));
1135
1712
} else if ((sscanf(s, "vlan(vid=%"SCNi16",pcp=%i,cfi=%i)%n",
1136
&vid, &pcp, &cfi, &n) > 0
1713
&vid, &pcp, &cfi, &n) > 0 && n > 0)) {
1138
1714
nl_msg_put_be16(key, OVS_KEY_ATTR_VLAN,
1139
1715
htons((vid << VLAN_VID_SHIFT) |
1140
1716
(pcp << VLAN_PCP_SHIFT) |
1141
1717
(cfi ? VLAN_CFI : 0)));
1719
nl_msg_put_be16(mask, OVS_KEY_ATTR_VLAN, htons(UINT16_MAX));
1150
if (sscanf(s, "eth_type(%i)%n", ð_type, &n) > 0 && n > 0) {
1730
if (mask && sscanf(s, "eth_type(%i/%i)%n",
1731
ð_type, ð_type_mask, &n) > 0 && n > 0) {
1732
if (eth_type != 0) {
1733
nl_msg_put_be16(key, OVS_KEY_ATTR_ETHERTYPE, htons(eth_type));
1735
nl_msg_put_be16(mask, OVS_KEY_ATTR_ETHERTYPE, htons(eth_type_mask));
1737
} else if (sscanf(s, "eth_type(%i)%n", ð_type, &n) > 0 && n > 0) {
1151
1738
nl_msg_put_be16(key, OVS_KEY_ATTR_ETHERTYPE, htons(eth_type));
1740
nl_msg_put_be16(mask, OVS_KEY_ATTR_ETHERTYPE,
1748
int label, tc, ttl, bos;
1749
int label_mask, tc_mask, ttl_mask, bos_mask;
1752
if (mask && sscanf(s, "mpls(label=%"SCNi32"/%"SCNi32",tc=%i/%i,ttl=%i/%i,bos=%i/%i)%n",
1753
&label, &label_mask, &tc, &tc_mask, &ttl, &ttl_mask, &bos, &bos_mask, &n) > 0 && n > 0) {
1754
struct ovs_key_mpls *mpls, *mpls_mask;
1756
mpls = nl_msg_put_unspec_uninit(key, OVS_KEY_ATTR_MPLS,
1758
mpls->mpls_lse = mpls_lse_from_components(label, tc, ttl, bos);
1760
mpls_mask = nl_msg_put_unspec_uninit(mask, OVS_KEY_ATTR_MPLS,
1762
mpls_mask->mpls_lse = mpls_lse_from_components(
1763
label_mask, tc_mask, ttl_mask, bos_mask);
1765
} else if (sscanf(s, "mpls(label=%"SCNi32",tc=%i,ttl=%i,bos=%i)%n",
1766
&label, &tc, &ttl, &bos, &n) > 0 &&
1768
struct ovs_key_mpls *mpls;
1770
mpls = nl_msg_put_unspec_uninit(key, OVS_KEY_ATTR_MPLS,
1772
mpls->mpls_lse = mpls_lse_from_components(label, tc, ttl, bos);
1774
mpls = nl_msg_put_unspec_uninit(mask, OVS_KEY_ATTR_MPLS,
1776
mpls->mpls_lse = htonl(UINT32_MAX);
1784
ovs_be32 ipv4_src, ipv4_src_mask;
1785
ovs_be32 ipv4_dst, ipv4_dst_mask;
1786
int ipv4_proto, ipv4_proto_mask;
1787
int ipv4_tos, ipv4_tos_mask;
1788
int ipv4_ttl, ipv4_ttl_mask;
1163
1791
enum ovs_frag_type ipv4_frag;
1166
if (sscanf(s, "ipv4(src="IP_SCAN_FMT",dst="IP_SCAN_FMT","
1794
if (mask && sscanf(s, "ipv4(src="IP_SCAN_FMT"/"IP_SCAN_FMT","
1795
"dst="IP_SCAN_FMT"/"IP_SCAN_FMT","
1796
"proto=%i/%i,tos=%i/%i,ttl=%i/%i,"
1797
"frag=%7[a-z]/%i)%n",
1798
IP_SCAN_ARGS(&ipv4_src), IP_SCAN_ARGS(&ipv4_src_mask),
1799
IP_SCAN_ARGS(&ipv4_dst), IP_SCAN_ARGS(&ipv4_dst_mask),
1800
&ipv4_proto, &ipv4_proto_mask,
1801
&ipv4_tos, &ipv4_tos_mask, &ipv4_ttl, &ipv4_ttl_mask,
1802
frag, &ipv4_frag_mask, &n) > 0
1804
&& ovs_frag_type_from_string(frag, &ipv4_frag)) {
1805
struct ovs_key_ipv4 ipv4_key;
1806
struct ovs_key_ipv4 ipv4_mask;
1808
ipv4_key.ipv4_src = ipv4_src;
1809
ipv4_key.ipv4_dst = ipv4_dst;
1810
ipv4_key.ipv4_proto = ipv4_proto;
1811
ipv4_key.ipv4_tos = ipv4_tos;
1812
ipv4_key.ipv4_ttl = ipv4_ttl;
1813
ipv4_key.ipv4_frag = ipv4_frag;
1814
nl_msg_put_unspec(key, OVS_KEY_ATTR_IPV4,
1815
&ipv4_key, sizeof ipv4_key);
1817
ipv4_mask.ipv4_src = ipv4_src_mask;
1818
ipv4_mask.ipv4_dst = ipv4_dst_mask;
1819
ipv4_mask.ipv4_proto = ipv4_proto_mask;
1820
ipv4_mask.ipv4_tos = ipv4_tos_mask;
1821
ipv4_mask.ipv4_ttl = ipv4_ttl_mask;
1822
ipv4_mask.ipv4_frag = ipv4_frag_mask;
1823
nl_msg_put_unspec(mask, OVS_KEY_ATTR_IPV4,
1824
&ipv4_mask, sizeof ipv4_mask);
1826
} else if (sscanf(s, "ipv4(src="IP_SCAN_FMT",dst="IP_SCAN_FMT","
1167
1827
"proto=%i,tos=%i,ttl=%i,frag=%7[a-z])%n",
1168
1828
IP_SCAN_ARGS(&ipv4_src), IP_SCAN_ARGS(&ipv4_dst),
1169
1829
&ipv4_proto, &ipv4_tos, &ipv4_ttl, frag, &n) > 0
1263
2039
icmp_key.icmp_code = icmp_code;
1264
2040
nl_msg_put_unspec(key, OVS_KEY_ATTR_ICMP,
1265
2041
&icmp_key, sizeof icmp_key);
2043
memset(&icmp_key, 0xff, sizeof icmp_key);
2044
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ICMP, &icmp_key,
1271
2052
struct ovs_key_icmpv6 icmpv6_key;
2053
struct ovs_key_icmpv6 icmpv6_mask;
2054
int icmpv6_type_mask;
2055
int icmpv6_code_mask;
1274
if (sscanf(s, "icmpv6(type=%"SCNi8",code=%"SCNi8")%n",
2058
if (mask && sscanf(s, "icmpv6(type=%"SCNi8"/%i,code=%"SCNi8"/%i)%n",
2059
&icmpv6_key.icmpv6_type, &icmpv6_type_mask,
2060
&icmpv6_key.icmpv6_code, &icmpv6_code_mask, &n) > 0
2062
nl_msg_put_unspec(key, OVS_KEY_ATTR_ICMPV6,
2063
&icmpv6_key, sizeof icmpv6_key);
2065
icmpv6_mask.icmpv6_type = icmpv6_type_mask;
2066
icmpv6_mask.icmpv6_code = icmpv6_code_mask;
2067
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ICMPV6, &icmpv6_mask,
2068
sizeof icmpv6_mask);
2070
} else if (sscanf(s, "icmpv6(type=%"SCNi8",code=%"SCNi8")%n",
1275
2071
&icmpv6_key.icmpv6_type, &icmpv6_key.icmpv6_code,&n) > 0
1277
2073
nl_msg_put_unspec(key, OVS_KEY_ATTR_ICMPV6,
1278
2074
&icmpv6_key, sizeof icmpv6_key);
2077
memset(&icmpv6_key, 0xff, sizeof icmpv6_key);
2078
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ICMPV6, &icmpv6_key,
2086
ovs_be32 arp_sip, arp_sip_mask;
2087
ovs_be32 arp_tip, arp_tip_mask;
2088
int arp_op, arp_op_mask;
1287
2089
uint8_t arp_sha[ETH_ADDR_LEN];
2090
uint8_t arp_sha_mask[ETH_ADDR_LEN];
1288
2091
uint8_t arp_tha[ETH_ADDR_LEN];
2092
uint8_t arp_tha_mask[ETH_ADDR_LEN];
1291
if (sscanf(s, "arp(sip="IP_SCAN_FMT",tip="IP_SCAN_FMT","
2095
if (mask && sscanf(s, "arp(sip="IP_SCAN_FMT"/"IP_SCAN_FMT","
2096
"tip="IP_SCAN_FMT"/"IP_SCAN_FMT","
2097
"op=%i/%i,sha="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT","
2098
"tha="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
2099
IP_SCAN_ARGS(&arp_sip), IP_SCAN_ARGS(&arp_sip_mask),
2100
IP_SCAN_ARGS(&arp_tip), IP_SCAN_ARGS(&arp_tip_mask),
2101
&arp_op, &arp_op_mask,
2102
ETH_ADDR_SCAN_ARGS(arp_sha),
2103
ETH_ADDR_SCAN_ARGS(arp_sha_mask),
2104
ETH_ADDR_SCAN_ARGS(arp_tha),
2105
ETH_ADDR_SCAN_ARGS(arp_tha_mask), &n) > 0 && n > 0) {
2106
struct ovs_key_arp arp_key;
2107
struct ovs_key_arp arp_mask;
2109
memset(&arp_key, 0, sizeof arp_key);
2110
arp_key.arp_sip = arp_sip;
2111
arp_key.arp_tip = arp_tip;
2112
arp_key.arp_op = htons(arp_op);
2113
memcpy(arp_key.arp_sha, arp_sha, ETH_ADDR_LEN);
2114
memcpy(arp_key.arp_tha, arp_tha, ETH_ADDR_LEN);
2115
nl_msg_put_unspec(key, OVS_KEY_ATTR_ARP, &arp_key, sizeof arp_key);
2117
arp_mask.arp_sip = arp_sip_mask;
2118
arp_mask.arp_tip = arp_tip_mask;
2119
arp_mask.arp_op = htons(arp_op_mask);
2120
memcpy(arp_mask.arp_sha, arp_sha_mask, ETH_ADDR_LEN);
2121
memcpy(arp_mask.arp_tha, arp_tha_mask, ETH_ADDR_LEN);
2122
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ARP,
2123
&arp_mask, sizeof arp_mask);
2125
} else if (sscanf(s, "arp(sip="IP_SCAN_FMT",tip="IP_SCAN_FMT","
1292
2126
"op=%i,sha="ETH_ADDR_SCAN_FMT",tha="ETH_ADDR_SCAN_FMT")%n",
1293
2127
IP_SCAN_ARGS(&arp_sip),
1294
2128
IP_SCAN_ARGS(&arp_tip),
1304
2138
memcpy(arp_key.arp_sha, arp_sha, ETH_ADDR_LEN);
1305
2139
memcpy(arp_key.arp_tha, arp_tha, ETH_ADDR_LEN);
1306
2140
nl_msg_put_unspec(key, OVS_KEY_ATTR_ARP, &arp_key, sizeof arp_key);
2143
memset(&arp_key, 0xff, sizeof arp_key);
2144
nl_msg_put_unspec(mask, OVS_KEY_ATTR_ARP,
2145
&arp_key, sizeof arp_key);
1312
2152
char nd_target_s[IPV6_SCAN_LEN + 1];
2153
char nd_target_mask_s[IPV6_SCAN_LEN + 1];
1313
2154
uint8_t nd_sll[ETH_ADDR_LEN];
2155
uint8_t nd_sll_mask[ETH_ADDR_LEN];
1314
2156
uint8_t nd_tll[ETH_ADDR_LEN];
2157
uint8_t nd_tll_mask[ETH_ADDR_LEN];
1317
if (sscanf(s, "nd(target="IPV6_SCAN_FMT")%n",
2160
nd_target_mask_s[0] = 0;
2161
memset(nd_sll_mask, 0xff, sizeof nd_sll_mask);
2162
memset(nd_tll_mask, 0xff, sizeof nd_tll_mask);
2164
if (mask && sscanf(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT")%n",
2165
nd_target_s, nd_target_mask_s, &n) > 0 && n > 0) {
2166
put_nd_key(n, nd_target_s, NULL, NULL, key);
2167
put_nd_mask(n, nd_target_mask_s, NULL, NULL, mask);
2168
} else if (sscanf(s, "nd(target="IPV6_SCAN_FMT")%n",
1318
2169
nd_target_s, &n) > 0 && n > 0) {
1319
return put_nd_key(n, nd_target_s, NULL, NULL, key);
1321
if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT")%n",
2170
put_nd_key(n, nd_target_s, NULL, NULL, key);
2172
put_nd_mask(n, nd_target_mask_s, NULL, NULL, mask);
2174
} else if (mask && sscanf(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
2175
",sll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
2176
nd_target_s, nd_target_mask_s,
2177
ETH_ADDR_SCAN_ARGS(nd_sll),
2178
ETH_ADDR_SCAN_ARGS(nd_sll_mask), &n) > 0 && n > 0) {
2179
put_nd_key(n, nd_target_s, nd_sll, NULL, key);
2180
put_nd_mask(n, nd_target_mask_s, nd_sll_mask, NULL, mask);
2181
} else if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT")%n",
1322
2182
nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll), &n) > 0
1324
return put_nd_key(n, nd_target_s, nd_sll, NULL, key);
1326
if (sscanf(s, "nd(target="IPV6_SCAN_FMT",tll="ETH_ADDR_SCAN_FMT")%n",
2184
put_nd_key(n, nd_target_s, nd_sll, NULL, key);
2186
put_nd_mask(n, nd_target_mask_s, nd_sll_mask, NULL, mask);
2188
} else if (mask && sscanf(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
2189
",tll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
2190
nd_target_s, nd_target_mask_s,
2191
ETH_ADDR_SCAN_ARGS(nd_tll),
2192
ETH_ADDR_SCAN_ARGS(nd_tll_mask), &n) > 0 && n > 0) {
2193
put_nd_key(n, nd_target_s, NULL, nd_tll, key);
2194
put_nd_mask(n, nd_target_mask_s, NULL, nd_tll_mask, mask);
2195
} else if (sscanf(s, "nd(target="IPV6_SCAN_FMT",tll="ETH_ADDR_SCAN_FMT")%n",
1327
2196
nd_target_s, ETH_ADDR_SCAN_ARGS(nd_tll), &n) > 0
1329
return put_nd_key(n, nd_target_s, NULL, nd_tll, key);
1331
if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT","
2198
put_nd_key(n, nd_target_s, NULL, nd_tll, key);
2200
put_nd_mask(n, nd_target_mask_s, NULL, nd_tll_mask, mask);
2202
} else if (mask && sscanf(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
2203
",sll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT","
2204
"tll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
2205
nd_target_s, nd_target_mask_s,
2206
ETH_ADDR_SCAN_ARGS(nd_sll), ETH_ADDR_SCAN_ARGS(nd_sll_mask),
2207
ETH_ADDR_SCAN_ARGS(nd_tll), ETH_ADDR_SCAN_ARGS(nd_tll_mask),
2210
put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
2211
put_nd_mask(n, nd_target_mask_s, nd_sll_mask, nd_tll_mask, mask);
2212
} else if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT","
1332
2213
"tll="ETH_ADDR_SCAN_FMT")%n",
1333
2214
nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll),
1334
2215
ETH_ADDR_SCAN_ARGS(nd_tll), &n) > 0
1336
return put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
2217
put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
2219
put_nd_mask(n, nd_target_mask_s,
2220
nd_sll_mask, nd_tll_mask, mask);
1340
2229
if (!strncmp(s, "encap(", 6)) {
1341
2230
const char *start = s;
2231
size_t encap, encap_mask = 0;
1344
2233
encap = nl_msg_start_nested(key, OVS_KEY_ATTR_ENCAP);
2235
encap_mask = nl_msg_start_nested(mask, OVS_KEY_ATTR_ENCAP);