netdev: New function netdev_nodev_set_etheraddr().
authorBen Pfaff <blp@nicira.com>
Tue, 3 Mar 2009 20:37:51 +0000 (12:37 -0800)
committerBen Pfaff <blp@nicira.com>
Tue, 3 Mar 2009 21:50:53 +0000 (13:50 -0800)
lib/netdev.c
lib/netdev.h

index 37d1f4c229883d011d95f0f240104172c8204883..5bca129b0e670b6a6b94db1a148812a74fef0460 100644 (file)
@@ -145,6 +145,8 @@ static int do_get_ifindex(const char *netdev_name);
 static int get_ifindex(const struct netdev *, int *ifindexp);
 static int get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN],
                          int *hwaddr_familyp);
+static int set_etheraddr(const char *netdev_name, int hwaddr_family,
+                         const uint8_t[ETH_ADDR_LEN]);
 
 /* Obtains the IPv6 address for 'name' into 'in6'. */
 static void
@@ -672,19 +674,18 @@ netdev_send_wait(struct netdev *netdev)
 int
 netdev_set_etheraddr(struct netdev *netdev, const uint8_t mac[ETH_ADDR_LEN])
 {
-    struct ifreq ifr;
-
-    memset(&ifr, 0, sizeof ifr);
-    strncpy(ifr.ifr_name, netdev->name, sizeof ifr.ifr_name);
-    ifr.ifr_hwaddr.sa_family = netdev->hwaddr_family;
-    memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ADDR_LEN);
-    if (ioctl(netdev->netdev_fd, SIOCSIFHWADDR, &ifr) < 0) {
-        VLOG_ERR("ioctl(SIOCSIFHWADDR) on %s device failed: %s",
-                 netdev->name, strerror(errno));
-        return errno;
+    int error = set_etheraddr(netdev->name, netdev->hwaddr_family, mac);
+    if (!error) {
+        memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
     }
-    memcpy(netdev->etheraddr, mac, ETH_ADDR_LEN);
-    return 0;
+    return error;
+}
+
+int
+netdev_nodev_set_etheraddr(const char *name, const uint8_t mac[ETH_ADDR_LEN])
+{
+    init_netdev();
+    return set_etheraddr(name, ARPHRD_ETHER, mac);
 }
 
 /* Returns a pointer to 'netdev''s MAC address.  The caller must not modify or
@@ -1272,6 +1273,23 @@ get_etheraddr(const char *netdev_name, uint8_t ea[ETH_ADDR_LEN],
         }
     }
     memcpy(ea, ifr.ifr_hwaddr.sa_data, ETH_ADDR_LEN);
+    return 0;
+}
 
+static int
+set_etheraddr(const char *netdev_name, int hwaddr_family,
+              const uint8_t mac[ETH_ADDR_LEN])
+{
+    struct ifreq ifr;
+
+    memset(&ifr, 0, sizeof ifr);
+    strncpy(ifr.ifr_name, netdev_name, sizeof ifr.ifr_name);
+    ifr.ifr_hwaddr.sa_family = hwaddr_family;
+    memcpy(ifr.ifr_hwaddr.sa_data, mac, ETH_ADDR_LEN);
+    if (ioctl(af_inet_sock, SIOCSIFHWADDR, &ifr) < 0) {
+        VLOG_ERR("ioctl(SIOCSIFHWADDR) on %s device failed: %s",
+                 netdev_name, strerror(errno));
+        return errno;
+    }
     return 0;
 }
index 960396ec2ff40778e8e9335addd818027c13f6a2..6981803ae9256ffdcf94540f8124fed9004d16af 100644 (file)
@@ -121,6 +121,7 @@ int netdev_get_stats(const struct netdev *, struct netdev_stats *);
 
 void netdev_enumerate(struct svec *);
 int netdev_nodev_get_flags(const char *netdev_name, enum netdev_flags *);
+int netdev_nodev_set_etheraddr(const char *name, const uint8_t mac[6]);
 int netdev_nodev_get_etheraddr(const char *netdev_name, uint8_t mac[6]);
 
 #endif /* netdev.h */