Re: [ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-07-02 Thread Ben Pfaff
On Fri, Jul 02, 2021 at 02:28:23PM -0400, Numan Siddique wrote:
> On Fri, Jul 2, 2021 at 2:26 PM Ben Pfaff  wrote:
> >
> > Did Brendan's feedback allow you to figure it out?  Otherwise, I will
> > look at it.
> 
> Yes.  You tested and acked the v2 of this patch.  The patch is merged now.

Oh, sorry, I'm going back through my inbox and I forget stuff sometimes
:-)
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Re: [ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-07-02 Thread Numan Siddique
On Fri, Jul 2, 2021 at 2:26 PM Ben Pfaff  wrote:
>
> Did Brendan's feedback allow you to figure it out?  Otherwise, I will
> look at it.

Yes.  You tested and acked the v2 of this patch.  The patch is merged now.

The test case should use space separated ip addresses instead of commas, since
extract_ip_addresses() doesn't support comma separated strings of ip addresses.

Thanks
Numan

>
> On Tue, Jun 29, 2021 at 02:01:19PM -0400, Numan Siddique wrote:
> > Hi Ben,
> >
> > This patch is not working as expected.   Need your help here.  Not very 
> > urgent.
> >
> > Please see below.
> >
> > Thanks
> > Numan
> >
> > On Tue, Jun 29, 2021 at 12:09 PM  wrote:
> > >
> > > From: Numan Siddique 
> > >
> > > The commit [1] didn't add the ddlog part.
> > >
> > > [1] - 8087cbc7462("ovn-northd.c: Add proxy ARP support to OVN")
> > >
> > > Signed-off-by: Numan Siddique 
> > > ---
> > >  northd/ovn.dl|  1 +
> > >  northd/ovn.rs| 13 +
> > >  northd/ovn_northd.dl | 38 ++
> > >  tests/ovn.at |  4 ++--
> > >  4 files changed, 54 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/northd/ovn.dl b/northd/ovn.dl
> > > index f23ea3b9e1..3c7a734ddb 100644
> > > --- a/northd/ovn.dl
> > > +++ b/northd/ovn.dl
> > > @@ -364,6 +364,7 @@ extern function is_dynamic_lsp_address(addr: string): 
> > > bool
> > >  extern function extract_lsp_addresses(address: string): 
> > > Option
> > >  extern function extract_addresses(address: string): 
> > > Option
> > >  extern function extract_lrp_networks(mac: string, networks: 
> > > Set): Option
> > > +extern function extract_ip_addresses(address: string): 
> > > Option
> > >
> > >  extern function split_addresses(addr: string): (Set, Set)
> > >
> > > diff --git a/northd/ovn.rs b/northd/ovn.rs
> > > index d44f83bc75..5f0939409c 100644
> > > --- a/northd/ovn.rs
> > > +++ b/northd/ovn.rs
> > > @@ -184,6 +184,18 @@ pub fn extract_lrp_networks(mac: , networks: 
> > > _std::Set) ->
> > >  }
> > >  }
> > >
> > > +pub fn extract_ip_addresses(address: ) -> 
> > > ddlog_std::Option {
> > > +unsafe {
> > > +let mut laddrs: lport_addresses_c = Default::default();
> > > +if ovn_c::extract_ip_addresses(string2cstr(address).as_ptr(),
> > > +laddrs as *mut 
> > > lport_addresses_c) {
> > > +ddlog_std::Option::Some{x: laddrs.into_ddlog()}
> > > +} else {
> > > +ddlog_std::Option::None
> > > +}
> > > +}
> > > +}
> > > +
> > >  pub fn ovn_internal_version() -> String {
> > >  unsafe {
> > >  let s = ovn_c::ovn_get_internal_version();
> > > @@ -623,6 +635,7 @@ mod ovn_c {
> > >  pub fn extract_addresses(address: *const raw::c_char, laddrs: 
> > > *mut lport_addresses_c, ofs: *mut raw::c_int) -> bool;
> > >  pub fn extract_lrp_networks__(mac: *const raw::c_char, networks: 
> > > *const *const raw::c_char,
> > >n_networks: libc::size_t, laddrs: 
> > > *mut lport_addresses_c) -> bool;
> > > +pub fn extract_ip_addresses(address: *const raw::c_char, laddrs: 
> > > *mut lport_addresses_c) -> bool;
> > >  pub fn destroy_lport_addresses(addrs: *mut lport_addresses_c);
> > >  pub fn is_dynamic_lsp_address(address: *const raw::c_char) -> 
> > > bool;
> > >  pub fn split_addresses(addresses: *const raw::c_char, ip4_addrs: 
> > > *mut ovs_svec, ipv6_addrs: *mut ovs_svec);
> > > diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl
> > > index 52a6206a18..a7a327c7f0 100644
> > > --- a/northd/ovn_northd.dl
> > > +++ b/northd/ovn_northd.dl
> > > @@ -3360,6 +3360,44 @@ for (CheckLspIsUp[check_lsp_is_up]) {
> > >  }
> > >  }
> > >
> > > +Flow(.logical_datapath = sw._uuid,
> > > + .stage= s_SWITCH_IN_ARP_ND_RSP(),
> > > + .priority = 50,
> > > + .__match  = __match,
> > > + .actions  = __actions,
> > > + .external_ids = stage_hint(sp.lsp._uuid)) :-
> > > +
> > > +sp in (.sw = sw, .peer = Some{rp}),
> > > +rp.is_enabled(),
> > > +var proxy_ips = {
> > > +match (sp.lsp.options.get("arp_proxy")) {
> > > +None -> "",
> > > +Some {addresses} -> {
> > > +match (extract_ip_addresses(addresses)) {
> > > +None -> "",
> > > +Some{addr} -> {
> > > +var ip4_addrs = vec_empty();
> > > +for (ip4 in addr.ipv4_addrs) {
> > > +ip4_addrs.push("${ip4.addr}")
> > > +};
> > > +string_join(ip4_addrs, ",")
> > > +}
> > > +}
> > > +}
> >
> > If the - sp.lsp.option.get("arp_proxy") has 2 IP addresses -
> > "10.0.0.4, 10.0.0.5",  then the above
> > code sets only "10.0.0.4" into the variable  "proxy_ips".  I was
> > expecting it 

Re: [ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-07-02 Thread Ben Pfaff
Did Brendan's feedback allow you to figure it out?  Otherwise, I will
look at it.

On Tue, Jun 29, 2021 at 02:01:19PM -0400, Numan Siddique wrote:
> Hi Ben,
> 
> This patch is not working as expected.   Need your help here.  Not very 
> urgent.
> 
> Please see below.
> 
> Thanks
> Numan
> 
> On Tue, Jun 29, 2021 at 12:09 PM  wrote:
> >
> > From: Numan Siddique 
> >
> > The commit [1] didn't add the ddlog part.
> >
> > [1] - 8087cbc7462("ovn-northd.c: Add proxy ARP support to OVN")
> >
> > Signed-off-by: Numan Siddique 
> > ---
> >  northd/ovn.dl|  1 +
> >  northd/ovn.rs| 13 +
> >  northd/ovn_northd.dl | 38 ++
> >  tests/ovn.at |  4 ++--
> >  4 files changed, 54 insertions(+), 2 deletions(-)
> >
> > diff --git a/northd/ovn.dl b/northd/ovn.dl
> > index f23ea3b9e1..3c7a734ddb 100644
> > --- a/northd/ovn.dl
> > +++ b/northd/ovn.dl
> > @@ -364,6 +364,7 @@ extern function is_dynamic_lsp_address(addr: string): 
> > bool
> >  extern function extract_lsp_addresses(address: string): 
> > Option
> >  extern function extract_addresses(address: string): Option
> >  extern function extract_lrp_networks(mac: string, networks: Set): 
> > Option
> > +extern function extract_ip_addresses(address: string): 
> > Option
> >
> >  extern function split_addresses(addr: string): (Set, Set)
> >
> > diff --git a/northd/ovn.rs b/northd/ovn.rs
> > index d44f83bc75..5f0939409c 100644
> > --- a/northd/ovn.rs
> > +++ b/northd/ovn.rs
> > @@ -184,6 +184,18 @@ pub fn extract_lrp_networks(mac: , networks: 
> > _std::Set) ->
> >  }
> >  }
> >
> > +pub fn extract_ip_addresses(address: ) -> 
> > ddlog_std::Option {
> > +unsafe {
> > +let mut laddrs: lport_addresses_c = Default::default();
> > +if ovn_c::extract_ip_addresses(string2cstr(address).as_ptr(),
> > +laddrs as *mut 
> > lport_addresses_c) {
> > +ddlog_std::Option::Some{x: laddrs.into_ddlog()}
> > +} else {
> > +ddlog_std::Option::None
> > +}
> > +}
> > +}
> > +
> >  pub fn ovn_internal_version() -> String {
> >  unsafe {
> >  let s = ovn_c::ovn_get_internal_version();
> > @@ -623,6 +635,7 @@ mod ovn_c {
> >  pub fn extract_addresses(address: *const raw::c_char, laddrs: *mut 
> > lport_addresses_c, ofs: *mut raw::c_int) -> bool;
> >  pub fn extract_lrp_networks__(mac: *const raw::c_char, networks: 
> > *const *const raw::c_char,
> >n_networks: libc::size_t, laddrs: 
> > *mut lport_addresses_c) -> bool;
> > +pub fn extract_ip_addresses(address: *const raw::c_char, laddrs: 
> > *mut lport_addresses_c) -> bool;
> >  pub fn destroy_lport_addresses(addrs: *mut lport_addresses_c);
> >  pub fn is_dynamic_lsp_address(address: *const raw::c_char) -> bool;
> >  pub fn split_addresses(addresses: *const raw::c_char, ip4_addrs: 
> > *mut ovs_svec, ipv6_addrs: *mut ovs_svec);
> > diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl
> > index 52a6206a18..a7a327c7f0 100644
> > --- a/northd/ovn_northd.dl
> > +++ b/northd/ovn_northd.dl
> > @@ -3360,6 +3360,44 @@ for (CheckLspIsUp[check_lsp_is_up]) {
> >  }
> >  }
> >
> > +Flow(.logical_datapath = sw._uuid,
> > + .stage= s_SWITCH_IN_ARP_ND_RSP(),
> > + .priority = 50,
> > + .__match  = __match,
> > + .actions  = __actions,
> > + .external_ids = stage_hint(sp.lsp._uuid)) :-
> > +
> > +sp in (.sw = sw, .peer = Some{rp}),
> > +rp.is_enabled(),
> > +var proxy_ips = {
> > +match (sp.lsp.options.get("arp_proxy")) {
> > +None -> "",
> > +Some {addresses} -> {
> > +match (extract_ip_addresses(addresses)) {
> > +None -> "",
> > +Some{addr} -> {
> > +var ip4_addrs = vec_empty();
> > +for (ip4 in addr.ipv4_addrs) {
> > +ip4_addrs.push("${ip4.addr}")
> > +};
> > +string_join(ip4_addrs, ",")
> > +}
> > +}
> > +}
> 
> If the - sp.lsp.option.get("arp_proxy") has 2 IP addresses -
> "10.0.0.4, 10.0.0.5",  then the above
> code sets only "10.0.0.4" into the variable  "proxy_ips".  I was
> expecting it to have "10.0.0.4,10.0.0.5".
> 
> I'm not sure if the issue is in "extract_ip_addresses" or somewhere else.
> 
> 
> > +}
> > +},
> > +proxy_ips != "",
> > +var __match = "arp.op == 1 && arp.tpa == {" ++ proxy_ips ++ "}",
> > +var __actions = "eth.dst = eth.src; "
> > +"eth.src = ${rp.networks.ea}; "
> > +"arp.op = 2; /* ARP reply */ "
> > +"arp.tha = arp.sha; "
> > +"arp.sha = %s; "
> > +"arp.tpa <-> arp.spa; "
> > +  

Re: [ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-06-29 Thread Numan Siddique
Hi Ben,

This patch is not working as expected.   Need your help here.  Not very urgent.

Please see below.

Thanks
Numan

On Tue, Jun 29, 2021 at 12:09 PM  wrote:
>
> From: Numan Siddique 
>
> The commit [1] didn't add the ddlog part.
>
> [1] - 8087cbc7462("ovn-northd.c: Add proxy ARP support to OVN")
>
> Signed-off-by: Numan Siddique 
> ---
>  northd/ovn.dl|  1 +
>  northd/ovn.rs| 13 +
>  northd/ovn_northd.dl | 38 ++
>  tests/ovn.at |  4 ++--
>  4 files changed, 54 insertions(+), 2 deletions(-)
>
> diff --git a/northd/ovn.dl b/northd/ovn.dl
> index f23ea3b9e1..3c7a734ddb 100644
> --- a/northd/ovn.dl
> +++ b/northd/ovn.dl
> @@ -364,6 +364,7 @@ extern function is_dynamic_lsp_address(addr: string): bool
>  extern function extract_lsp_addresses(address: string): 
> Option
>  extern function extract_addresses(address: string): Option
>  extern function extract_lrp_networks(mac: string, networks: Set): 
> Option
> +extern function extract_ip_addresses(address: string): 
> Option
>
>  extern function split_addresses(addr: string): (Set, Set)
>
> diff --git a/northd/ovn.rs b/northd/ovn.rs
> index d44f83bc75..5f0939409c 100644
> --- a/northd/ovn.rs
> +++ b/northd/ovn.rs
> @@ -184,6 +184,18 @@ pub fn extract_lrp_networks(mac: , networks: 
> _std::Set) ->
>  }
>  }
>
> +pub fn extract_ip_addresses(address: ) -> 
> ddlog_std::Option {
> +unsafe {
> +let mut laddrs: lport_addresses_c = Default::default();
> +if ovn_c::extract_ip_addresses(string2cstr(address).as_ptr(),
> +laddrs as *mut 
> lport_addresses_c) {
> +ddlog_std::Option::Some{x: laddrs.into_ddlog()}
> +} else {
> +ddlog_std::Option::None
> +}
> +}
> +}
> +
>  pub fn ovn_internal_version() -> String {
>  unsafe {
>  let s = ovn_c::ovn_get_internal_version();
> @@ -623,6 +635,7 @@ mod ovn_c {
>  pub fn extract_addresses(address: *const raw::c_char, laddrs: *mut 
> lport_addresses_c, ofs: *mut raw::c_int) -> bool;
>  pub fn extract_lrp_networks__(mac: *const raw::c_char, networks: 
> *const *const raw::c_char,
>n_networks: libc::size_t, laddrs: *mut 
> lport_addresses_c) -> bool;
> +pub fn extract_ip_addresses(address: *const raw::c_char, laddrs: 
> *mut lport_addresses_c) -> bool;
>  pub fn destroy_lport_addresses(addrs: *mut lport_addresses_c);
>  pub fn is_dynamic_lsp_address(address: *const raw::c_char) -> bool;
>  pub fn split_addresses(addresses: *const raw::c_char, ip4_addrs: 
> *mut ovs_svec, ipv6_addrs: *mut ovs_svec);
> diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl
> index 52a6206a18..a7a327c7f0 100644
> --- a/northd/ovn_northd.dl
> +++ b/northd/ovn_northd.dl
> @@ -3360,6 +3360,44 @@ for (CheckLspIsUp[check_lsp_is_up]) {
>  }
>  }
>
> +Flow(.logical_datapath = sw._uuid,
> + .stage= s_SWITCH_IN_ARP_ND_RSP(),
> + .priority = 50,
> + .__match  = __match,
> + .actions  = __actions,
> + .external_ids = stage_hint(sp.lsp._uuid)) :-
> +
> +sp in (.sw = sw, .peer = Some{rp}),
> +rp.is_enabled(),
> +var proxy_ips = {
> +match (sp.lsp.options.get("arp_proxy")) {
> +None -> "",
> +Some {addresses} -> {
> +match (extract_ip_addresses(addresses)) {
> +None -> "",
> +Some{addr} -> {
> +var ip4_addrs = vec_empty();
> +for (ip4 in addr.ipv4_addrs) {
> +ip4_addrs.push("${ip4.addr}")
> +};
> +string_join(ip4_addrs, ",")
> +}
> +}
> +}

If the - sp.lsp.option.get("arp_proxy") has 2 IP addresses -
"10.0.0.4, 10.0.0.5",  then the above
code sets only "10.0.0.4" into the variable  "proxy_ips".  I was
expecting it to have "10.0.0.4,10.0.0.5".

I'm not sure if the issue is in "extract_ip_addresses" or somewhere else.


> +}
> +},
> +proxy_ips != "",
> +var __match = "arp.op == 1 && arp.tpa == {" ++ proxy_ips ++ "}",
> +var __actions = "eth.dst = eth.src; "
> +"eth.src = ${rp.networks.ea}; "
> +"arp.op = 2; /* ARP reply */ "
> +"arp.tha = arp.sha; "
> +"arp.sha = %s; "
> +"arp.tpa <-> arp.spa; "
> +"outport = inport; "
> +"flags.loopback = 1; "
> +"output;".
> +
>  /* For ND solicitations, we need to listen for both the
>   * unicast IPv6 address and its all-nodes multicast address,
>   * but always respond with the unicast IPv6 address. */
> diff --git a/tests/ovn.at b/tests/ovn.at
> index db1a0a35c2..31f0b90996 100644
> --- a/tests/ovn.at
> +++ 

Re: [ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-06-29 Thread 0-day Robot
Bleep bloop.  Greetings Numan Siddique, I am a robot and I have tried out your 
patch.
Thanks for your contribution.

I encountered some error that I wasn't expecting.  See the details below.


checkpatch:
WARNING: Line is 85 characters long (recommended limit is 79)
#38 FILE: northd/ovn.rs:187:
pub fn extract_ip_addresses(address: ) -> 
ddlog_std::Option {

WARNING: Line is 105 characters long (recommended limit is 79)
#57 FILE: northd/ovn.rs:638:
pub fn extract_ip_addresses(address: *const raw::c_char, laddrs: *mut 
lport_addresses_c) -> bool;

Lines checked: 134, Warnings: 2, Errors: 0


Please check this out.  If you feel there has been an error, please email 
acon...@redhat.com

Thanks,
0-day Robot
___
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev


[ovs-dev] [PATCH ovn] northd-ddlog: Add proxy arp flows for configured addresses in lsp router port.

2021-06-29 Thread numans
From: Numan Siddique 

The commit [1] didn't add the ddlog part.

[1] - 8087cbc7462("ovn-northd.c: Add proxy ARP support to OVN")

Signed-off-by: Numan Siddique 
---
 northd/ovn.dl|  1 +
 northd/ovn.rs| 13 +
 northd/ovn_northd.dl | 38 ++
 tests/ovn.at |  4 ++--
 4 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/northd/ovn.dl b/northd/ovn.dl
index f23ea3b9e1..3c7a734ddb 100644
--- a/northd/ovn.dl
+++ b/northd/ovn.dl
@@ -364,6 +364,7 @@ extern function is_dynamic_lsp_address(addr: string): bool
 extern function extract_lsp_addresses(address: string): Option
 extern function extract_addresses(address: string): Option
 extern function extract_lrp_networks(mac: string, networks: Set): 
Option
+extern function extract_ip_addresses(address: string): Option
 
 extern function split_addresses(addr: string): (Set, Set)
 
diff --git a/northd/ovn.rs b/northd/ovn.rs
index d44f83bc75..5f0939409c 100644
--- a/northd/ovn.rs
+++ b/northd/ovn.rs
@@ -184,6 +184,18 @@ pub fn extract_lrp_networks(mac: , networks: 
_std::Set) ->
 }
 }
 
+pub fn extract_ip_addresses(address: ) -> 
ddlog_std::Option {
+unsafe {
+let mut laddrs: lport_addresses_c = Default::default();
+if ovn_c::extract_ip_addresses(string2cstr(address).as_ptr(),
+laddrs as *mut lport_addresses_c) {
+ddlog_std::Option::Some{x: laddrs.into_ddlog()}
+} else {
+ddlog_std::Option::None
+}
+}
+}
+
 pub fn ovn_internal_version() -> String {
 unsafe {
 let s = ovn_c::ovn_get_internal_version();
@@ -623,6 +635,7 @@ mod ovn_c {
 pub fn extract_addresses(address: *const raw::c_char, laddrs: *mut 
lport_addresses_c, ofs: *mut raw::c_int) -> bool;
 pub fn extract_lrp_networks__(mac: *const raw::c_char, networks: 
*const *const raw::c_char,
   n_networks: libc::size_t, laddrs: *mut 
lport_addresses_c) -> bool;
+pub fn extract_ip_addresses(address: *const raw::c_char, laddrs: *mut 
lport_addresses_c) -> bool;
 pub fn destroy_lport_addresses(addrs: *mut lport_addresses_c);
 pub fn is_dynamic_lsp_address(address: *const raw::c_char) -> bool;
 pub fn split_addresses(addresses: *const raw::c_char, ip4_addrs: *mut 
ovs_svec, ipv6_addrs: *mut ovs_svec);
diff --git a/northd/ovn_northd.dl b/northd/ovn_northd.dl
index 52a6206a18..a7a327c7f0 100644
--- a/northd/ovn_northd.dl
+++ b/northd/ovn_northd.dl
@@ -3360,6 +3360,44 @@ for (CheckLspIsUp[check_lsp_is_up]) {
 }
 }
 
+Flow(.logical_datapath = sw._uuid,
+ .stage= s_SWITCH_IN_ARP_ND_RSP(),
+ .priority = 50,
+ .__match  = __match,
+ .actions  = __actions,
+ .external_ids = stage_hint(sp.lsp._uuid)) :-
+
+sp in (.sw = sw, .peer = Some{rp}),
+rp.is_enabled(),
+var proxy_ips = {
+match (sp.lsp.options.get("arp_proxy")) {
+None -> "",
+Some {addresses} -> {
+match (extract_ip_addresses(addresses)) {
+None -> "",
+Some{addr} -> {
+var ip4_addrs = vec_empty();
+for (ip4 in addr.ipv4_addrs) {
+ip4_addrs.push("${ip4.addr}")
+};
+string_join(ip4_addrs, ",")
+}
+}
+}
+}
+},
+proxy_ips != "",
+var __match = "arp.op == 1 && arp.tpa == {" ++ proxy_ips ++ "}",
+var __actions = "eth.dst = eth.src; "
+"eth.src = ${rp.networks.ea}; "
+"arp.op = 2; /* ARP reply */ "
+"arp.tha = arp.sha; "
+"arp.sha = %s; "
+"arp.tpa <-> arp.spa; "
+"outport = inport; "
+"flags.loopback = 1; "
+"output;".
+
 /* For ND solicitations, we need to listen for both the
  * unicast IPv6 address and its all-nodes multicast address,
  * but always respond with the unicast IPv6 address. */
diff --git a/tests/ovn.at b/tests/ovn.at
index db1a0a35c2..31f0b90996 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -26940,7 +26940,7 @@ ovs-vsctl -- add-port br-int vif1 -- \
 # And proxy ARP flows for 69.254.239.254 and 169.254.239.2
 # and check that SB flows have been added.
 ovn-nbctl --wait=hv add Logical_Switch_Port rp-ls1 \
-options arp_proxy='"169.254.239.254 169.254.239.2"'
+options arp_proxy='"169.254.239.254,169.254.239.2"'
 ovn-sbctl dump-flows > sbflows
 AT_CAPTURE_FILE([sbflows])
 
@@ -26957,7 +26957,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep ls_in_arp_rsp | 
grep "169.254.239.2"], [1]
 
 # Add the flows back send arp request and check we see an ARP response
 ovn-nbctl --wait=hv add Logical_Switch_Port rp-ls1 \
-options arp_proxy='"169.254.239.254 169.254.239.2"'