Send /proc/<pid>/comm value when reporting active ports
Bug: 382998551
Test: Run VmTerminalApp
Test: adb logcat | grep reportVmActivePorts
Change-Id: I0ba2046b040327519a5c5847c9a27e35b6fdedde
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java b/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java
index 147a7e5..b4dffee 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/DebianServiceImpl.java
@@ -34,7 +34,6 @@
import io.grpc.stub.StreamObserver;
import java.util.Set;
-import java.util.stream.Collectors;
final class DebianServiceImpl extends DebianServiceGrpc.DebianServiceImplBase {
private final Context mContext;
@@ -56,11 +55,8 @@
public void reportVmActivePorts(
ReportVmActivePortsRequest request,
StreamObserver<ReportVmActivePortsResponse> responseObserver) {
- Log.d(TAG, "reportVmActivePorts: " + request.toString());
- mPortsStateManager.updateActivePorts(
- request.getPortsList().stream()
- .map(activePort -> activePort.getPort())
- .collect(Collectors.toSet()));
+ mPortsStateManager.updateActivePorts(request.getPortsList());
+ Log.d(TAG, "reportVmActivePorts: " + mPortsStateManager.getActivePorts());
ReportVmActivePortsResponse reply =
ReportVmActivePortsResponse.newBuilder().setSuccess(true).build();
responseObserver.onNext(reply);
diff --git a/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt b/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
index 317ca8e..c5335ac 100644
--- a/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
+++ b/android/TerminalApp/java/com/android/virtualization/terminal/PortsStateManager.kt
@@ -18,6 +18,7 @@
import android.content.Context
import android.content.SharedPreferences
import com.android.internal.annotations.GuardedBy
+import com.android.virtualization.terminal.proto.ActivePort
import java.util.HashSet
/**
@@ -27,7 +28,7 @@
class PortsStateManager private constructor(private val sharedPref: SharedPreferences) {
private val lock = Any()
- @GuardedBy("lock") private val activePorts: MutableSet<Int> = hashSetOf()
+ @GuardedBy("lock") private val activePorts: MutableMap<Int, ActivePort> = hashMapOf()
@GuardedBy("lock")
private val enabledPorts: MutableSet<Int> =
@@ -44,7 +45,13 @@
fun getActivePorts(): Set<Int> {
synchronized(lock) {
- return HashSet<Int>(activePorts)
+ return HashSet<Int>(activePorts.keys)
+ }
+ }
+
+ fun getActivePortInfo(port: Int): ActivePort? {
+ synchronized(lock) {
+ return activePorts[port]
}
}
@@ -54,11 +61,11 @@
}
}
- fun updateActivePorts(ports: Set<Int>) {
+ fun updateActivePorts(ports: List<ActivePort>) {
val oldPorts = getActivePorts()
synchronized(lock) {
activePorts.clear()
- activePorts.addAll(ports)
+ activePorts.putAll(ports.associateBy { it.port })
}
notifyPortsStateUpdated(oldPorts, getActivePorts())
}
diff --git a/guest/forwarder_guest_launcher/src/main.rs b/guest/forwarder_guest_launcher/src/main.rs
index bed8965..963a531 100644
--- a/guest/forwarder_guest_launcher/src/main.rs
+++ b/guest/forwarder_guest_launcher/src/main.rs
@@ -22,7 +22,7 @@
use futures::stream::StreamExt;
use log::{debug, error};
use serde::Deserialize;
-use std::collections::HashSet;
+use std::collections::HashMap;
use std::process::Stdio;
use tokio::io::BufReader;
use tokio::process::Command;
@@ -46,6 +46,8 @@
ip: i8,
lport: i32,
rport: i32,
+ #[serde(alias = "C-COMM")]
+ c_comm: String,
newstate: String,
}
@@ -88,12 +90,12 @@
}
async fn send_active_ports_report(
- listening_ports: HashSet<i32>,
+ listening_ports: HashMap<i32, ActivePort>,
client: &mut DebianServiceClient<Channel>,
) -> Result<(), Box<dyn std::error::Error>> {
let res = client
.report_vm_active_ports(Request::new(ReportVmActivePortsRequest {
- ports: listening_ports.into_iter().map(|port| ActivePort { port }).collect(),
+ ports: listening_ports.values().cloned().collect(),
}))
.await?
.into_inner();
@@ -126,12 +128,16 @@
// TODO(b/340126051): Consider using NETLINK_SOCK_DIAG for the optimization.
let listeners = listeners::get_all()?;
// TODO(b/340126051): Support distinguished port forwarding for ipv6 as well.
- let mut listening_ports: HashSet<_> = listeners
+ let mut listening_ports: HashMap<_, _> = listeners
.iter()
- .map(|x| x.socket)
- .filter(|x| x.is_ipv4())
- .map(|x| x.port().into())
- .filter(|x| is_forwardable_port(*x))
+ .filter(|x| x.socket.is_ipv4())
+ .map(|x| {
+ (
+ x.socket.port().into(),
+ ActivePort { port: x.socket.port().into(), comm: x.process.name.to_string() },
+ )
+ })
+ .filter(|(x, _)| is_forwardable_port(*x))
.collect();
send_active_ports_report(listening_ports.clone(), &mut client).await?;
@@ -149,7 +155,7 @@
}
match row.newstate.as_str() {
TCPSTATES_STATE_LISTEN => {
- listening_ports.insert(row.lport);
+ listening_ports.insert(row.lport, ActivePort { port: row.lport, comm: row.c_comm });
}
TCPSTATES_STATE_CLOSE => {
listening_ports.remove(&row.lport);
diff --git a/libs/debian_service/proto/DebianService.proto b/libs/debian_service/proto/DebianService.proto
index 7ab0af7..43955fa 100644
--- a/libs/debian_service/proto/DebianService.proto
+++ b/libs/debian_service/proto/DebianService.proto
@@ -31,9 +31,9 @@
int32 cid = 1;
}
-// TODO(b/382998551): Add more information about the port.
message ActivePort {
int32 port = 1;
+ string comm = 2;
}
message ReportVmActivePortsRequest {