|
@@ -334,6 +334,86 @@ impl Socket for TcpSocket {
|
|
|
})
|
|
|
.unwrap_or(Ok(()))
|
|
|
}
|
|
|
+
|
|
|
+ fn set_option(&self, level: PSOL, name: usize, val: &[u8]) -> Result<(), SystemError> {
|
|
|
+ if level != PSOL::TCP {
|
|
|
+ // return Err(EINVAL);
|
|
|
+ log::debug!("TcpSocket::set_option: not TCP");
|
|
|
+ return Ok(());
|
|
|
+ }
|
|
|
+ use option::Options::{self, *};
|
|
|
+ let option_name = Options::try_from(name as i32)?;
|
|
|
+ log::debug!("TCP Option: {:?}, value = {:?}", option_name, val);
|
|
|
+ match option_name {
|
|
|
+ NoDelay => {
|
|
|
+ let nagle_enabled = val[0] != 0;
|
|
|
+ let mut writer = self.inner.write();
|
|
|
+ let inner = writer.take().expect("Tcp Inner is None");
|
|
|
+ match inner {
|
|
|
+ Inner::Established(established) => {
|
|
|
+ established.with_mut(|socket| {
|
|
|
+ socket.set_nagle_enabled(nagle_enabled);
|
|
|
+ });
|
|
|
+ writer.replace(Inner::Established(established));
|
|
|
+ }
|
|
|
+ _ => {
|
|
|
+ writer.replace(inner);
|
|
|
+ return Err(EINVAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ KeepIntvl => {
|
|
|
+ if val.len() == 4 {
|
|
|
+ let mut writer = self.inner.write();
|
|
|
+ let inner = writer.take().expect("Tcp Inner is None");
|
|
|
+ match inner {
|
|
|
+ Inner::Established(established) => {
|
|
|
+ let interval = u32::from_ne_bytes([val[0], val[1], val[2], val[3]]);
|
|
|
+ established.with_mut(|socket| {
|
|
|
+ socket.set_keep_alive(Some(smoltcp::time::Duration::from_secs(interval as u64)));
|
|
|
+ });
|
|
|
+ writer.replace(Inner::Established(established));
|
|
|
+ }
|
|
|
+ _ => {
|
|
|
+ writer.replace(inner);
|
|
|
+ return Err(EINVAL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return Err(EINVAL);
|
|
|
+ }
|
|
|
+ },
|
|
|
+ KeepCnt => {
|
|
|
+ // if val.len() == 4 {
|
|
|
+ // let mut writer = self.inner.write();
|
|
|
+ // let inner = writer.take().expect("Tcp Inner is None");
|
|
|
+ // match inner {
|
|
|
+ // Inner::Established(established) => {
|
|
|
+ // let count = u32::from_ne_bytes([val[0], val[1], val[2], val[3]]);
|
|
|
+ // established.with_mut(|socket| {
|
|
|
+ // socket.set_keep_alive_count(count);
|
|
|
+ // });
|
|
|
+ // writer.replace(Inner::Established(established));
|
|
|
+ // }
|
|
|
+ // _ => {
|
|
|
+ // writer.replace(inner);
|
|
|
+ // return Err(EINVAL);
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // } else {
|
|
|
+ // return Err(EINVAL);
|
|
|
+ // }
|
|
|
+ },
|
|
|
+ KeepIdle => {
|
|
|
+
|
|
|
+ },
|
|
|
+ _ => {
|
|
|
+ log::debug!("TcpSocket::set_option: not supported");
|
|
|
+ // return Err(ENOPROTOOPT);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
impl InetSocket for TcpSocket {
|