diff --git a/sd_event_loop.cpp b/sd_event_loop.cpp
index 7a647cc..2ad5d2e 100644
--- a/sd_event_loop.cpp
+++ b/sd_event_loop.cpp
@@ -11,6 +11,7 @@
 #include <boost/asio/io_context.hpp>
 #include <phosphor-logging/log.hpp>
 #include <sdbusplus/asio/sd_event.hpp>
+#include <user_channel/channel_layer.hpp>
 
 namespace eventloop
 {
@@ -46,13 +47,117 @@
                           });
 }
 
-int EventLoop::setupSocket(std::shared_ptr<sdbusplus::asio::connection>& bus,
-                           std::string iface, uint16_t reqPort)
+int EventLoop::getVLANID(const std::string channel)
 {
-    static constexpr const char* unboundIface = "rmcpp";
-    if (iface == "")
+    int vlanid = 0;
+    if (channel.empty())
     {
-        iface = unboundIface;
+        return 0;
+    }
+
+    sdbusplus::bus::bus bus{ipmid_get_sd_bus_connection()};
+    // Enumerate all VLAN + ETHERNET interfaces
+    auto req = bus.new_method_call(MAPPER_BUS_NAME, MAPPER_OBJ, MAPPER_INTF,
+                                   "GetSubTree");
+    req.append(PATH_ROOT, 0,
+               std::vector<std::string>{INTF_VLAN, INTF_ETHERNET});
+    ObjectTree objs;
+    try
+    {
+        auto reply = bus.call(req);
+        reply.read(objs);
+    }
+    catch (std::exception& e)
+    {
+        log<level::ERR>("getVLANID: failed to execute/read GetSubTree");
+        return 0;
+    }
+
+    std::string ifService, logicalPath;
+    for (const auto& [path, impls] : objs)
+    {
+        if (path.find(channel) == path.npos)
+        {
+            continue;
+        }
+        for (const auto& [service, intfs] : impls)
+        {
+            bool vlan = false;
+            bool ethernet = false;
+            for (const auto& intf : intfs)
+            {
+                if (intf == INTF_VLAN)
+                {
+                    vlan = true;
+                }
+                else if (intf == INTF_ETHERNET)
+                {
+                    ethernet = true;
+                }
+            }
+            if (ifService.empty() && (vlan || ethernet))
+            {
+                ifService = service;
+            }
+            if (logicalPath.empty() && vlan)
+            {
+                logicalPath = path;
+            }
+        }
+    }
+
+    // VLAN devices will always have a separate logical object
+    if (logicalPath.empty())
+    {
+        return 0;
+    }
+
+    Value value;
+    auto method = bus.new_method_call(ifService.c_str(), logicalPath.c_str(),
+                                      PROP_INTF, METHOD_GET);
+    method.append(INTF_VLAN, "Id");
+    try
+    {
+        auto method_reply = bus.call(method);
+        method_reply.read(value);
+    }
+    catch (std::exception& e)
+    {
+        log<level::ERR>("getVLANID: failed to execute/read VLAN Id");
+        return 0;
+    }
+
+    vlanid = std::get<uint32_t>(value);
+    if ((vlanid & VLAN_VALUE_MASK) != vlanid)
+    {
+        log<level::ERR>("networkd returned an invalid vlan",
+                        entry("VLAN=%", vlanid));
+        return 0;
+    }
+
+    return vlanid;
+}
+
+int EventLoop::setupSocket(std::shared_ptr<sdbusplus::asio::connection>& bus,
+                           std::string channel, uint16_t reqPort)
+{
+    std::string iface = channel;
+    static constexpr const char* unboundIface = "rmcpp";
+    if (channel == "")
+    {
+        iface = channel = unboundIface;
+    }
+    else
+    {
+        // If VLANID of this channel is set, bind the socket to this
+        // VLAN logic device
+        auto vlanid = getVLANID(channel);
+        if (vlanid)
+        {
+            iface = iface + "." + std::to_string(vlanid);
+            log<level::DEBUG>("This channel has VLAN id",
+                              entry("VLANID=%d", vlanid));
+        }
     }
     // Create our own socket if SysD did not supply one.
     int listensFdCount = sd_listen_fds(0);
@@ -104,6 +209,8 @@
                             entry("ERROR=%s", strerror(errno)));
             return EXIT_FAILURE;
         }
+        log<level::INFO>("Bind to interfae",
+                         entry("INTERFACE=%s", iface.c_str()));
     }
     // cannot be constexpr because it gets passed by address
     const int option_enabled = 1;
@@ -114,7 +221,7 @@
                  &option_enabled, sizeof(option_enabled));
 
     // set the dbus name
-    std::string busName = "xyz.openbmc_project.Ipmi.Channel." + iface;
+    std::string busName = "xyz.openbmc_project.Ipmi.Channel." + channel;
     try
     {
         bus->request_name(busName.c_str());
