Browse Source

Merge pull request #510 from smoltcp-rs/v075-cherrypick

V0.7.5 cherrypick
Dario Nieuwenhuis 3 years ago
parent
commit
048f29d8cf
2 changed files with 63 additions and 0 deletions
  1. 12 0
      CHANGELOG.md
  2. 51 0
      src/wire/dhcpv4.rs

+ 12 - 0
CHANGELOG.md

@@ -10,6 +10,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Update `managed` from 0.7 to 0.8 ([442](https://github.com/smoltcp-rs/smoltcp/pull/442))
 - udp: Add `close()` method to unbind socket.
 
+## [0.7.5] - 2021-06-28
+
+- dhcpv4: emit DNS servers in repr (#505)
+
+## [0.7.4] - 2021-06-11
+
+- tcp: fix "subtract sequence numbers with underflow" on remote window shrink. (#490)
+- tcp: fix substract with overflow when receiving a SYNACK with unincremented ACK number. (#491)
+- tcp: use nonzero initial sequence number to workaround misbehaving servers. (#492)
+
 ## [0.7.3] - 2021-05-29
 
 - Fix "unused attribute" error in recent nightlies.
@@ -73,6 +83,8 @@ only processed when directed to the 255.255.255.255 address. ([377](https://gith
 - Simplify lifetime parameters of sockets, SocketSet, EthernetInterface ([410](https://github.com/smoltcp-rs/smoltcp/pull/410), [413](https://github.com/smoltcp-rs/smoltcp/pull/413))
 
 [Unreleased]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.0...HEAD
+[0.7.5]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.4...v0.7.5
+[0.7.4]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.3...v0.7.4
 [0.7.3]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.2...v0.7.3
 [0.7.2]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.1...v0.7.2
 [0.7.1]: https://github.com/smoltcp-rs/smoltcp/compare/v0.7.0...v0.7.1

+ 51 - 0
src/wire/dhcpv4.rs

@@ -727,6 +727,10 @@ impl<'a> Repr<'a> {
         if self.lease_duration.is_some() {
             len += 6;
         }
+        if let Some(dns_servers) = self.dns_servers {
+            len += 2;
+            len += dns_servers.iter().flatten().count() * core::mem::size_of::<u32>();
+        }
         if let Some(list) = self.parameter_request_list {
             len += list.len() + 2;
         }
@@ -892,6 +896,25 @@ impl<'a> Repr<'a> {
             if let Some(duration) = self.lease_duration {
                 options = DhcpOption::IpLeaseTime(duration).emit(options);
             }
+            if let Some(dns_servers) = self.dns_servers {
+                const IP_SIZE: usize = core::mem::size_of::<u32>();
+                let mut servers = [0; MAX_DNS_SERVER_COUNT * IP_SIZE];
+
+                let data_len = dns_servers
+                    .iter()
+                    .flatten()
+                    .enumerate()
+                    .inspect(|(i, ip)| {
+                        servers[(i * IP_SIZE)..((i + 1) * IP_SIZE)].copy_from_slice(ip.as_bytes());
+                    })
+                    .count()
+                    * IP_SIZE;
+                let option = DhcpOption::Other {
+                    kind: field::OPT_DOMAIN_NAME_SERVER,
+                    data: &servers[..data_len],
+                };
+                options = option.emit(options);
+            }
             if let Some(list) = self.parameter_request_list {
                 options = DhcpOption::Other {
                     kind: field::OPT_PARAMETER_REQUEST_LIST,
@@ -1151,6 +1174,34 @@ mod test {
         repr.emit(&mut packet).unwrap();
     }
 
+    #[test]
+    fn test_emit_offer_dns() {
+        let repr = {
+            let mut repr = offer_repr();
+            repr.dns_servers = Some([
+                Some(Ipv4Address([163, 1, 74, 6])),
+                Some(Ipv4Address([163, 1, 74, 7])),
+                Some(Ipv4Address([163, 1, 74, 3])),
+            ]);
+            repr
+        };
+        let mut bytes = vec![0xa5; repr.buffer_len()];
+        let mut packet = Packet::new_unchecked(&mut bytes);
+        repr.emit(&mut packet).unwrap();
+
+        let packet = Packet::new_unchecked(&bytes);
+        let repr_parsed = Repr::parse(&packet).unwrap();
+
+        assert_eq!(
+            repr_parsed.dns_servers,
+            Some([
+                Some(Ipv4Address([163, 1, 74, 6])),
+                Some(Ipv4Address([163, 1, 74, 7])),
+                Some(Ipv4Address([163, 1, 74, 3]))
+            ])
+        );
+    }
+
     #[test]
     fn test_emit_dhcp_option() {
         static DATA: &[u8] = &[1, 3, 6];