On Mon, Jun 5, 2023 at 9:31 PM Mark Michelson <[email protected]> wrote:
> On 6/2/23 09:45, Ales Musil wrote: > > On Fri, Jun 2, 2023 at 12:43 PM Ales Musil <[email protected]> wrote: > > > >> Add support for FQDN option (39), if specified the server > >> can overwrite FQDN for the client. It behaves similarly > >> to DHCP hostname option (12). > >> > >> > > Reported-at: https://bugzilla.redhat.com/2211890 > > > > I have created BZ for this it should be added on merge or I'll add it > > if there is a need for v2. > > > > Signed-off-by: Ales Musil <[email protected]> > >> --- > >> NEWS | 2 + > >> controller/pinctrl.c | 27 +++++++- > >> lib/actions.c | 30 ++++++++- > >> lib/ovn-l7.h | 10 +++ > >> northd/ovn-northd.c | 3 +- > >> ovn-nb.xml | 7 ++ > >> ovn-sb.ovsschema | 6 +- > >> tests/ovn.at | 156 > ++++++++++++++++++++++++------------------- > >> tests/test-ovn.c | 1 + > >> 9 files changed, 166 insertions(+), 76 deletions(-) > >> > >> diff --git a/NEWS b/NEWS > >> index 1532f635a..b4dd0da05 100644 > >> --- a/NEWS > >> +++ b/NEWS > >> @@ -1,5 +1,7 @@ > >> Post v23.06.0 > >> ------------- > >> + - Add DHCPv6 "fqdn" (39) option, that works similarly to > >> + DHCPv4 "hostname" (12) option. > >> > >> OVN v23.06.0 - xx xxx xxxx > >> -------------------------- > >> diff --git a/controller/pinctrl.c b/controller/pinctrl.c > >> index c396ad4c2..51dbadc99 100644 > >> --- a/controller/pinctrl.c > >> +++ b/controller/pinctrl.c > >> @@ -2288,7 +2288,7 @@ exit: > >> static bool > >> compose_out_dhcpv6_opts(struct ofpbuf *userdata, > >> struct ofpbuf *out_dhcpv6_opts, > >> - ovs_be32 iaid, bool ipxe_req) > >> + ovs_be32 iaid, bool ipxe_req, uint8_t > fqdn_flags) > >> { > >> while (userdata->size) { > >> struct dhcpv6_opt_header *userdata_opt = ofpbuf_try_pull( > >> @@ -2412,6 +2412,24 @@ compose_out_dhcpv6_opts(struct ofpbuf *userdata, > >> break; > >> } > >> > >> + case DHCPV6_OPT_FQDN_CODE: { > >> + if (fqdn_flags != DHCPV6_FQDN_FLAGS_UNDEFINED) { > >> + struct dhcpv6_opt_header *header = > >> + ofpbuf_put_zeros(out_dhcpv6_opts, sizeof > *header); > >> + header->code = htons(DHCPV6_OPT_FQDN_CODE); > >> + header->len = htons(size + 1); > >> + uint8_t *flags = ofpbuf_put_zeros(out_dhcpv6_opts, 1); > >> + /* If client requested N or S inform him that it > >> + * was overwritten by the server. */ > >> + if (fqdn_flags & DHCPV6_FQDN_FLAGS_N || > >> + fqdn_flags & DHCPV6_FQDN_FLAGS_S) { > >> + *flags |= DHCPV6_FQDN_FLAGS_O; > >> + } > > I read through RFC 4704 section 4.1, and I think the flag-handling is > slightly off here. > > First, here's what is said about the "O" bit: > > The "O" bit indicates whether the server has overridden the client's > preference for the "S" bit. A client MUST set this bit to 0. A > server MUST set this bit to 1 if the "S" bit in its reply to the > client does not match the "S" bit received from the client. > > Based on my reading, we only need to set the O bit if the client set the > S bit to 1. The client N bit should not factor into our setting of the O > bit. > > Then later, when discussing the "N" bit: > > ... A server sets the "N" bit to indicate whether the > server SHALL (0) or SHALL NOT (1) perform DNS updates. If the "N" > bit is 1, the "S" bit MUST be 0. > > I think our stance is that we are not performing DNS updates as the > server, so we probably should be setting the N bit to 1 in all our replies. > NGL the flags are a bit confusing. But reading through it again it seems that we need to always set "S" = 0, "N" = 1 and "O" = 1 if "S" from client == 1. > > > >> + ofpbuf_put(out_dhcpv6_opts, userdata_opt_data, size); > >> + } > >> + break; > >> + } > >> + > >> default: > >> return false; > >> } > >> @@ -2500,6 +2518,7 @@ pinctrl_handle_put_dhcpv6_opts( > >> size_t l4_len = dp_packet_l4_size(pkt_in); > >> uint8_t *end = (uint8_t *)in_udp + MIN(udp_len, l4_len); > >> bool ipxe_req = false; > >> + uint8_t fqdn_flags = DHCPV6_FQDN_FLAGS_UNDEFINED; > >> while (in_dhcpv6_data < end) { > >> struct dhcpv6_opt_header const *in_opt = > >> (struct dhcpv6_opt_header *)in_dhcpv6_data; > >> @@ -2524,6 +2543,10 @@ pinctrl_handle_put_dhcpv6_opts( > >> break; > >> } > >> > >> + case DHCPV6_OPT_FQDN_CODE: > >> + fqdn_flags = *(in_dhcpv6_data + sizeof *in_opt); > >> + break; > >> + > >> default: > >> break; > >> } > >> @@ -2547,7 +2570,7 @@ pinctrl_handle_put_dhcpv6_opts( > >> OFPBUF_STUB_INITIALIZER(out_ofpacts_dhcpv6_opts_stub); > >> > >> if (!compose_out_dhcpv6_opts(userdata, &out_dhcpv6_opts, > >> - iaid, ipxe_req)) { > >> + iaid, ipxe_req, fqdn_flags)) { > >> VLOG_WARN_RL(&rl, "Invalid userdata"); > >> goto exit; > >> } > >> diff --git a/lib/actions.c b/lib/actions.c > >> index ec27223f9..0ec69bec9 100644 > >> --- a/lib/actions.c > >> +++ b/lib/actions.c > >> @@ -2470,7 +2470,8 @@ parse_gen_opt(struct action_context *ctx, struct > >> ovnact_gen_option *o, > >> } > >> > >> if (!strcmp(o->option->type, "str") || > >> - !strcmp(o->option->type, "domains")) { > >> + !strcmp(o->option->type, "domains") || > >> + !strcmp(o->option->type, "domain")) { > >> if (o->value.type != EXPR_C_STRING) { > >> lexer_error(ctx->lexer, "%s option %s requires string > value.", > >> opts_type, o->option->name); > >> @@ -2903,6 +2904,33 @@ encode_put_dhcpv6_option(const struct > >> ovnact_gen_option *o, > >> size = strlen(c->string); > >> opt->len = htons(size); > >> ofpbuf_put(ofpacts, c->string, size); > >> + } else if (!strcmp(o->option->type, "domain")) { > >> + /* The DNS format is 2 bytes longer than the "domain". > >> + * It replaces every '.' with len of the next name. */ > >> + size_t domain_len = strlen(c->string); > >> + size = domain_len + 2; > >> + char *encoded = xzalloc(size); > >> + > >> + int8_t label_len = 0; > >> + for (size_t i = 0; i < domain_len; i++) { > >> + if (c->string[i] == '.') { > >> + encoded[i - label_len] = label_len; > >> + label_len = 0; > >> + } else { > >> + encoded[i + 1] = c->string[i]; > >> + label_len++; > >> + } > >> + } > >> + > >> + /* This is required for the last label if it doesn't end with > '.' > >> */ > >> + if (label_len) { > >> + encoded[domain_len - label_len] = label_len; > >> + } > > This section where you encode the domain name is nearly identical to > existing code in dns_build_ptr_answer() in controller/pinctrl.c > > I suggest extracting the common code into a function and calling that > function here and in dns_build_ptr_answer(). > Yeah you are right, I'll extract it to some common place. > >> + > >> + opt->len = htons(size); > >> + ofpbuf_put(ofpacts, encoded, size); > >> + > >> + free(encoded); > >> } > >> } > >> > >> diff --git a/lib/ovn-l7.h b/lib/ovn-l7.h > >> index d9b103119..9dc331421 100644 > >> --- a/lib/ovn-l7.h > >> +++ b/lib/ovn-l7.h > >> @@ -270,6 +270,7 @@ BUILD_ASSERT_DECL(DHCP_OPT_HEADER_LEN == > sizeof(struct > >> dhcp_opt_header)); > >> #define DHCPV6_OPT_DOMAIN_SEARCH_CODE 24 > >> #define DHCPV6_OPT_IA_PD 25 > >> #define DHCPV6_OPT_IA_PREFIX 26 > >> +#define DHCPV6_OPT_FQDN_CODE 39 > >> #define DHCPV6_OPT_BOOT_FILE_URL 59 > >> #define DHCPV6_OPT_BOOT_FILE_URL_ALT 254 > >> > >> @@ -291,6 +292,15 @@ BUILD_ASSERT_DECL(DHCP_OPT_HEADER_LEN == > >> sizeof(struct dhcp_opt_header)); > >> #define DHCPV6_OPT_BOOTFILE_NAME_ALT \ > >> DHCP_OPTION("bootfile_name_alt", DHCPV6_OPT_BOOT_FILE_URL_ALT, > "str") > >> > >> +#define DHCPV6_OPT_FQDN \ > >> + DHCP_OPTION("fqdn", DHCPV6_OPT_FQDN_CODE, "domain") > >> + > >> +/* DHCPv6 FQDN flags. RFC 4704 */ > >> +#define DHCPV6_FQDN_FLAGS_UNDEFINED 0xff > >> +#define DHCPV6_FQDN_FLAGS_S 1 << 0 > >> +#define DHCPV6_FQDN_FLAGS_O 1 << 1 > >> +#define DHCPV6_FQDN_FLAGS_N 1 << 2 > >> + > >> OVS_PACKED( > >> struct dhcpv6_opt_header { > >> ovs_be16 code; > >> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c > >> index 3515b68a2..2bafbd4af 100644 > >> --- a/northd/ovn-northd.c > >> +++ b/northd/ovn-northd.c > >> @@ -273,7 +273,8 @@ static struct gen_opts_map supported_dhcpv6_opts[] > = { > >> DHCPV6_OPT_DOMAIN_SEARCH, > >> DHCPV6_OPT_DNS_SERVER, > >> DHCPV6_OPT_BOOTFILE_NAME, > >> - DHCPV6_OPT_BOOTFILE_NAME_ALT > >> + DHCPV6_OPT_BOOTFILE_NAME_ALT, > >> + DHCPV6_OPT_FQDN, > >> }; > >> > >> static bool > >> diff --git a/ovn-nb.xml b/ovn-nb.xml > >> index 9afe3b584..05e155b89 100644 > >> --- a/ovn-nb.xml > >> +++ b/ovn-nb.xml > >> @@ -4191,6 +4191,13 @@ or > >> way. Default value for this option is false. > >> </p> > >> </column> > >> + > >> + <column name="options" key="fqdn"> > >> + <p> > >> + The DHCPv6 option code for this option is 39. > >> + If set, indicates the DHCPv6 option "FQDN". > >> + </p> > >> + </column> > >> </group> > >> </group> > >> > >> diff --git a/ovn-sb.ovsschema b/ovn-sb.ovsschema > >> index f59af8cc5..06e16b403 100644 > >> --- a/ovn-sb.ovsschema > >> +++ b/ovn-sb.ovsschema > >> @@ -1,7 +1,7 @@ > >> { > >> "name": "OVN_Southbound", > >> - "version": "20.27.2", > >> - "cksum": "1291808617 30462", > >> + "version": "20.27.3", > >> + "cksum": "3876528905 30472", > >> "tables": { > >> "SB_Global": { > >> "columns": { > >> @@ -311,7 +311,7 @@ > >> "type": { > >> "type": {"key": { > >> "type": "string", > >> - "enum": ["set", ["ipv6", "str", "mac"]]}}}}, > >> + "enum": ["set", ["ipv6", "str", "mac", > >> "domain"]]}}}}, > >> "isRoot": true}, > >> "Connection": { > >> "columns": { > >> diff --git a/tests/ovn.at b/tests/ovn.at > >> index d8c694002..ab6052299 100644 > >> --- a/tests/ovn.at > >> +++ b/tests/ovn.at > >> @@ -1697,6 +1697,9 @@ reg1[0] = put_dhcpv6_opts(bootfile_name=" > >> https://127.0.0.1/boot.ipxe"); > >> reg1[0] = put_dhcpv6_opts(bootfile_name_alt=" > https://127.0.0.1/boot.ipxe > >> "); > >> formats as reg1[0] = put_dhcpv6_opts(bootfile_name_alt = " > >> https://127.0.0.1/boot.ipxe"); > >> encodes as > >> > controller(userdata=00.00.00.05.00.00.00.00.00.01.de.10.00.00.00.40.00.fe.00.1b.68.74.74.70.73.3a.2f.2f.31.32.37.2e.30.2e.30.2e.31.2f.62.6f.6f.74.2e.69.70.78.65,pause) > >> +reg1[0] = put_dhcpv6_opts(fqdn="ovn.org"); > >> + formats as reg1[0] = put_dhcpv6_opts(fqdn = "ovn.org"); > >> + encodes as > >> > controller(userdata=00.00.00.05.00.00.00.00.00.01.de.10.00.00.00.40.00.27.00.09.03.6f.76.6e.03.6f.72.67.00,pause) > >> > >> # lookup_nd > >> reg2[0] = lookup_nd(inport, ip6.dst, eth.src); > >> @@ -7083,6 +7086,7 @@ AT_CLEANUP > >> > >> OVN_FOR_EACH_NORTHD([ > >> AT_SETUP([dhcpv6 : 1 HV, 2 LS, 5 LSPs]) > >> +AT_SKIP_IF([test $HAVE_SCAPY = no]) > >> ovn_start > >> > >> ovn-nbctl ls-add ls1 > >> @@ -7171,61 +7175,56 @@ trim_zeros() { > >> # packet should be received twice (one from ovn-controller and the > other > >> # from the "ovs-ofctl monitor br-int resume" > >> test_dhcpv6() { > >> - local inport=$1 src_mac=$2 src_lla=$3 msg_code=$4 offer_ip=$5 > ipxe=$6 > >> - if test $ipxe -eq 2; then > >> - req_len=34 > >> - elif test $msg_code != 0b; then > >> - req_len=2a > >> - else > >> - req_len=1a > >> - fi > >> - local > >> request=ffffffffffff${src_mac}86dd6000000000${req_len}1101${src_lla} > >> - # dst ip ff02::1:2 > >> - request=${request}ff020000000000000000000000010002 > >> - # udp header and dhcpv6 header > >> - request=${request}0222022300${req_len}ffff${msg_code}010203 > >> - # Client identifier > >> - request=${request}0001000a00030001${src_mac} > >> + local inport=$1 src_mac=$2 src_lla=$3 msg_code=$4 offer_ip=$5 > >> boot_file=$6 > >> + local fqdn=$7 > >> + > >> + local req_scapy="Ether(dst='ff:ff:ff:ff:ff:ff', src='${src_mac}')/ > \ > >> + IPv6(dst='ff02::1:2', src='${src_lla}')/ \ > >> + UDP(sport=546, dport=547)/ \ > >> + DHCP6(msgtype=${msg_code}, trid=0x010203)/ \ > >> + > DHCP6OptClientId(duid=DUID_LL(lladdr='${src_mac}'))" > >> + > > Yay for switching to a more readable method of generating packets! > It's a pretty time consuming process for packets with so many nested options, but worth it. > > >> # Add IA-NA (Identity Association for Non Temporary Address) if > >> msg_code > >> # is not 11 (information request packet) > >> - if test $msg_code != 0b; then > >> - request=${request}0003000c0102030400000e1000001518 > >> + if test $msg_code != 11; then > >> + req_scapy="${req_scapy}/DHCP6OptIA_NA(iaid=0x01020304, T1=3600, > >> T2=5400)" > >> fi > >> - if test $ipxe -eq 2; then > >> - request=${request}000f0006000669505845 > >> + if test "$boot_file" = "bootfile_name"; then > >> + local uc_data="USER_CLASS_DATA(data=b'iPXE')" > >> + > >> req_scapy="${req_scapy}/DHCP6OptUserClass(userclassdata=[[${uc_data}]])" > >> fi > >> - shift; shift; shift; shift; shift; shift; > >> + if test -n "$fqdn"; then > >> + req_scapy="${req_scapy}/DHCP6OptClientFQDN(flags=0x01, > >> fqdn=b'test')" > >> + fi > >> + request=$(fmt_pkt "${req_scapy}") > >> + shift; shift; shift; shift; shift; shift; shift; > >> if test $offer_ip != 0; then > >> - local server_mac=000000100001 > >> - local server_lla=fe80000000000000020000fffe100001 > >> - local reply_code=07 > >> - if test $msg_code = 01; then > >> - reply_code=02 > >> - fi > >> - local msg_len=54 > >> - if test $ipxe -eq 1; then > >> - msg_len=69 > >> - elif test $ipxe -eq 2; then > >> - msg_len=65 > >> - elif test $offer_ip = 1; then > >> - msg_len=28 > >> + local reply_code=7 > >> + if test $msg_code = 1; then > >> + reply_code=2 > >> fi > >> - local > >> > reply=${src_mac}${server_mac}86dd6000000000${msg_len}1101${server_lla}${src_lla} > >> - # udp header and dhcpv6 header > >> - reply=${reply}0223022200${msg_len}ffff${reply_code}010203 > >> - # Client identifier > >> - reply=${reply}0001000a00030001${src_mac} > >> - # IA-NA > >> + > >> + local rep_scapy="Ether(dst='${src_mac}', > >> src='00:00:00:10:00:01')/ \ > >> + IPv6(dst='${src_lla}', > >> src='fe80::0200:00ff:fe10:0001')/ \ > >> + UDP(sport=547, dport=546)/ \ > >> + DHCP6(msgtype=${reply_code}, trid=0x010203)/ \ > >> + > >> DHCP6OptClientId(duid=DUID_LL(lladdr='${src_mac}'))" > >> + > >> if test $offer_ip != 1; then > >> - > >> > reply=${reply}0003002801020304ffffffffffffffff00050018${offer_ip}ffffffffffffffff > >> + local ip_scapy="DHCP6OptIAAddress(addr='${offer_ip}', \ > >> + preflft=0xffffffff, validlft=0xffffffff)" > >> + rep_scapy="${rep_scapy}/ \ > >> + DHCP6OptIA_NA(iaid=0x01020304, T1=0xffffffff, \ > >> + T2=0xffffffff, ianaopts=[[${ip_scapy}]])" > >> fi > >> - if test $ipxe -eq 1; then > >> - reply=${reply}003b0011626f6f7466696c655f6e616d655f616c74 > >> - elif test $ipxe -eq 2; then > >> - reply=${reply}003b000d626f6f7466696c655f6e616d65 > >> + if test -n "$boot_file"; then > >> + > >> rep_scapy="${rep_scapy}/DHCP6OptBootFileUrl(optdata=b'${boot_file}')" > >> fi > >> - # Server identifier > >> - reply=${reply}0002000a00030001${server_mac} > >> + if test -n "$fqdn"; then > >> + rep_scapy="${rep_scapy}/DHCP6OptClientFQDN(flags=0x02, > >> fqdn=b'${fqdn}')" > >> + fi > >> + > >> > rep_scapy="${rep_scapy}/DHCP6OptServerId(duid=DUID_LL(lladdr='00:00:00:10:00:01'))" > >> + reply=$(fmt_pkt "${rep_scapy}") > >> echo $reply | trim_zeros >> $inport.expected > >> else > >> for outport; do > >> @@ -7249,16 +7248,16 @@ echo "---------------------" > >> ovn-sbctl list logical_flow > >> echo "---------------------" > >> > >> -ovn-sbctl dump-flows > sbflows > >> +#ovn-sbctl dump-flows > sbflows > >> AT_CAPTURE_FILE([sbflows]) > >> > >> echo "------ hv1 dump ----------" > >> as hv1 ovs-ofctl dump-flows br-int > >> > >> -src_mac=f00000000001 > >> -src_lla=fe80000000000000f20000fffe000001 > >> -offer_ip=ae700000000000000000000000000004 > >> -test_dhcpv6 1 $src_mac $src_lla 01 $offer_ip 0 > >> +src_mac="f0:00:00:00:00:01" > >> +src_lla="fe80::f200:00ff:fe00:0001" > >> +offer_ip="ae70::4" > >> +test_dhcpv6 1 $src_mac $src_lla 1 $offer_ip "" "" > >> > >> # NXT_RESUMEs should be 1. > >> OVS_WAIT_UNTIL([test 1 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> @@ -7281,12 +7280,12 @@ rm 1.expected > >> reset_pcap_file hv1-vif1 hv1/vif1 > >> reset_pcap_file hv1-vif2 hv1/vif2 > >> > >> -src_mac=f00000000002 > >> -src_lla=fe80000000000000f20000fffe000002 > >> -offer_ip=ae700000000000000000000000000005 > >> +src_mac="f0:00:00:00:00:02" > >> +src_lla="fe80::f200:00ff:fe00:0002" > >> +offer_ip="ae70::5" > >> # Set invalid msg_type > >> > >> -test_dhcpv6 2 $src_mac $src_lla 10 0 0 1 1 > >> +test_dhcpv6 2 $src_mac $src_lla 16 0 "" "" 1 1 > >> > >> # NXT_RESUMEs should be 2. > >> OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> @@ -7305,9 +7304,9 @@ AT_CHECK([cat 1.packets], [0], [expout]) > >> # There should be no DHCPv6 reply from ovn-controller and the request > >> packet > >> # should be received by ls2-lp2. > >> > >> -src_mac=f00000000003 > >> -src_lla=fe80000000000000f20000fffe000003 > >> -test_dhcpv6 3 $src_mac $src_lla 01 0 0 4 > >> +src_mac="f0:00:00:00:00:03" > >> +src_lla="fe80::f200:00ff:fe00:0003" > >> +test_dhcpv6 3 $src_mac $src_lla 1 0 "" "" 4 > >> > >> # NXT_RESUMEs should be 2 only. > >> OVS_WAIT_UNTIL([test 2 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> @@ -7323,10 +7322,10 @@ AT_CHECK([cat 4.packets], [0], [expout]) > >> > >> # Send DHCPv6 packet on ls1-lp3. native DHCPv6 works as stateless mode > >> for this port. > >> # The DHCPv6 reply shouldn't contain offer_ip. > >> -src_mac=f00000000022 > >> -src_lla=fe80000000000000f20000fffe000022 > >> +src_mac="f0:00:00:00:00:22" > >> +src_lla="fe80::f200:00ff:fe00:0022" > >> reset_pcap_file hv1-vif5 hv1/vif5 > >> -test_dhcpv6 5 $src_mac $src_lla 01 1 0 5 > >> +test_dhcpv6 5 $src_mac $src_lla 1 1 "" "" 5 > >> > >> # NXT_RESUMEs should be 3. > >> OVS_WAIT_UNTIL([test 3 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> @@ -7338,11 +7337,11 @@ AT_CHECK([cat 5.packets | cut -c 1-120,125- ], > >> [0], [expout]) > >> > >> # Send DHCPv6 information request (code 11) on ls1-lp3. The DHCPv6 > reply > >> # shouldn't contain offer_ip > >> -src_mac=f00000000022 > >> -src_lla=fe80000000000000f20000fffe000022 > >> +src_mac="f0:00:00:00:00:22" > >> +src_lla="fe80::f200:00ff:fe00:0022" > >> reset_pcap_file hv1-vif5 hv1/vif5 > >> rm -f 5.expected > >> -test_dhcpv6 5 $src_mac $src_lla 0b 1 0 5 > >> +test_dhcpv6 5 $src_mac $src_lla 11 1 "" "" 5 > >> > >> # NXT_RESUMEs should be 4. > >> OVS_WAIT_UNTIL([test 4 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> @@ -7363,11 +7362,11 @@ ovn-nbctl lsp-set-dhcpv6-options ls1-lp2 ${d1} > >> > >> reset_pcap_file hv1-vif2 hv1/vif2 > >> > >> -src_mac=f00000000002 > >> -src_lla=fe80000000000000f20000fffe000002 > >> -offer_ip=ae700000000000000000000000000005 > >> +src_mac="f0:00:00:00:00:02" > >> +src_lla="fe80::f200:00ff:fe00:0002" > >> +offer_ip="ae70::5" > >> > >> -test_dhcpv6 2 $src_mac $src_lla 01 $offer_ip 1 > >> +test_dhcpv6 2 $src_mac $src_lla 1 $offer_ip "bootfile_name_alt" "" > >> # NXT_RESUMEs should be 5. > >> OVS_WAIT_UNTIL([test 5 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> > >> @@ -7381,7 +7380,7 @@ AT_CHECK([cat 2.packets | cut -c 1-120,125- ], > [0], > >> [expout]) > >> reset_pcap_file hv1-vif2 hv1/vif2 > >> rm 2.packets 2.expected > >> > >> -test_dhcpv6 2 $src_mac $src_lla 01 $offer_ip 2 > >> +test_dhcpv6 2 $src_mac $src_lla 1 $offer_ip "bootfile_name" "" > >> # NXT_RESUMEs should be 6. > >> OVS_WAIT_UNTIL([test 6 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> > >> @@ -7389,6 +7388,25 @@ $PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" > >> hv1/vif2-tx.pcap | trim_zeros > 2.pa > >> cat 2.expected | cut -c 1-120,125- > expout > >> AT_CHECK([cat 2.packets | cut -c 1-120,125- ], [0], [expout]) > >> > >> +ovn-nbctl --all destroy dhcp-option > >> +d1="$(ovn-nbctl create DHCP_Options cidr="ae70\:\:/64")" > >> +ovn-nbctl dhcp-options-set-options $d1 \ > >> + server_id=00:00:00:10:00:01 \ > >> + fqdn=\"ovn.org\" > >> +ovn-nbctl --wait=hv lsp-set-dhcpv6-options ls1-lp2 ${d1} > >> + > >> +reset_pcap_file hv1-vif2 hv1/vif2 > >> +rm 2.packets 2.expected > >> + > >> +test_dhcpv6 2 $src_mac $src_lla 1 $offer_ip "" "ovn.org" > >> +# NXT_RESUMEs should be 7. > >> +OVS_WAIT_UNTIL([test 7 = `cat ofctl_monitor*.log | grep -c > NXT_RESUME`]) > >> + > >> +$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" hv1/vif2-tx.pcap | > >> trim_zeros > 2.packets > >> +cat 2.expected | cut -c 1-120,125- > expout > >> +cat 2.packets > >> +AT_CHECK([cat 2.packets | cut -c 1-120,125- ], [0], [expout]) > >> + > >> OVN_CLEANUP([hv1]) > >> > >> AT_CLEANUP > >> diff --git a/tests/test-ovn.c b/tests/test-ovn.c > >> index ce9213c1d..6c7754eac 100644 > >> --- a/tests/test-ovn.c > >> +++ b/tests/test-ovn.c > >> @@ -207,6 +207,7 @@ create_gen_opts(struct hmap *dhcp_opts, struct hmap > >> *dhcpv6_opts, > >> dhcp_opt_add(dhcpv6_opts, "domain_search", 24, "str"); > >> dhcp_opt_add(dhcpv6_opts, "bootfile_name", 59, "str"); > >> dhcp_opt_add(dhcpv6_opts, "bootfile_name_alt", 254, "str"); > >> + dhcp_opt_add(dhcpv6_opts, "fqdn", 39, "domain"); > >> > >> /* IPv6 ND RA options. */ > >> hmap_init(nd_ra_opts); > >> -- > >> 2.40.1 > >> > >> > > > > Thanks, Ales -- Ales Musil Senior Software Engineer - OVN Core Red Hat EMEA <https://www.redhat.com> [email protected] IM: amusil <https://red.ht/sig> _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
