- if (sscanf(s, "nd(target="IPV6_SCAN_FMT")%n",
- nd_target_s, &n) > 0 && n > 0) {
- return put_nd_key(n, nd_target_s, NULL, NULL, key);
- }
- if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT")%n",
- nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll), &n) > 0
- && n > 0) {
- return put_nd_key(n, nd_target_s, nd_sll, NULL, key);
- }
- if (sscanf(s, "nd(target="IPV6_SCAN_FMT",tll="ETH_ADDR_SCAN_FMT")%n",
- nd_target_s, ETH_ADDR_SCAN_ARGS(nd_tll), &n) > 0
- && n > 0) {
- return put_nd_key(n, nd_target_s, NULL, nd_tll, key);
- }
- if (sscanf(s, "nd(target="IPV6_SCAN_FMT",sll="ETH_ADDR_SCAN_FMT","
- "tll="ETH_ADDR_SCAN_FMT")%n",
- nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll),
- ETH_ADDR_SCAN_ARGS(nd_tll), &n) > 0
- && n > 0) {
- return put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
+ nd_target_mask_s[0] = 0;
+ memset(nd_sll_mask, 0xff, sizeof nd_sll_mask);
+ memset(nd_tll_mask, 0xff, sizeof nd_tll_mask);
+
+ if (mask && ovs_scan(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT")%n",
+ nd_target_s, nd_target_mask_s, &n)) {
+ put_nd_key(n, nd_target_s, NULL, NULL, key);
+ put_nd_mask(n, nd_target_mask_s, NULL, NULL, mask);
+ } else if (ovs_scan(s, "nd(target="IPV6_SCAN_FMT")%n",
+ nd_target_s, &n)) {
+ put_nd_key(n, nd_target_s, NULL, NULL, key);
+ if (mask) {
+ put_nd_mask(n, nd_target_mask_s, NULL, NULL, mask);
+ }
+ } else if (mask &&
+ ovs_scan(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
+ ",sll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, nd_target_mask_s,
+ ETH_ADDR_SCAN_ARGS(nd_sll),
+ ETH_ADDR_SCAN_ARGS(nd_sll_mask), &n)) {
+ put_nd_key(n, nd_target_s, nd_sll, NULL, key);
+ put_nd_mask(n, nd_target_mask_s, nd_sll_mask, NULL, mask);
+ } else if (ovs_scan(s, "nd(target="IPV6_SCAN_FMT","
+ "sll="ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll), &n)) {
+ put_nd_key(n, nd_target_s, nd_sll, NULL, key);
+ if (mask) {
+ put_nd_mask(n, nd_target_mask_s, nd_sll_mask, NULL, mask);
+ }
+ } else if (mask &&
+ ovs_scan(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
+ ",tll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, nd_target_mask_s,
+ ETH_ADDR_SCAN_ARGS(nd_tll),
+ ETH_ADDR_SCAN_ARGS(nd_tll_mask), &n)) {
+ put_nd_key(n, nd_target_s, NULL, nd_tll, key);
+ put_nd_mask(n, nd_target_mask_s, NULL, nd_tll_mask, mask);
+ } else if (ovs_scan(s, "nd(target="IPV6_SCAN_FMT","
+ "tll="ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, ETH_ADDR_SCAN_ARGS(nd_tll), &n)) {
+ put_nd_key(n, nd_target_s, NULL, nd_tll, key);
+ if (mask) {
+ put_nd_mask(n, nd_target_mask_s, NULL, nd_tll_mask, mask);
+ }
+ } else if (mask &&
+ ovs_scan(s, "nd(target="IPV6_SCAN_FMT"/"IPV6_SCAN_FMT
+ ",sll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT","
+ "tll="ETH_ADDR_SCAN_FMT"/"ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, nd_target_mask_s,
+ ETH_ADDR_SCAN_ARGS(nd_sll),
+ ETH_ADDR_SCAN_ARGS(nd_sll_mask),
+ ETH_ADDR_SCAN_ARGS(nd_tll),
+ ETH_ADDR_SCAN_ARGS(nd_tll_mask),
+ &n)) {
+ put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
+ put_nd_mask(n, nd_target_mask_s, nd_sll_mask, nd_tll_mask, mask);
+ } else if (ovs_scan(s, "nd(target="IPV6_SCAN_FMT","
+ "sll="ETH_ADDR_SCAN_FMT","
+ "tll="ETH_ADDR_SCAN_FMT")%n",
+ nd_target_s, ETH_ADDR_SCAN_ARGS(nd_sll),
+ ETH_ADDR_SCAN_ARGS(nd_tll), &n)) {
+ put_nd_key(n, nd_target_s, nd_sll, nd_tll, key);
+ if (mask) {
+ put_nd_mask(n, nd_target_mask_s,
+ nd_sll_mask, nd_tll_mask, mask);
+ }