netdev-linux: Factor out removing policing.
authorBen Pfaff <blp@nicira.com>
Mon, 3 May 2010 22:31:38 +0000 (15:31 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 5 May 2010 21:00:50 +0000 (14:00 -0700)
This is duplicated code that the following commit will rewrite.

lib/netdev-linux.c

index abd905c3c8cee928148401b455f5d185673d6307..c44d6baf69950f376ab8e927a90b752bef4838c1 100644 (file)
@@ -1280,6 +1280,24 @@ done:
  */
 #define POLICE_DEL_CMD "/sbin/tc qdisc del dev %s handle ffff: ingress 2>/dev/null"
 
+/* Remove ingress policing from 'netdev'.  Returns 0 if successful, otherwise a
+ * positive errno value. */
+static int
+netdev_linux_remove_policing(struct netdev *netdev)
+{
+    const char *netdev_name = netdev_get_name(netdev);
+    char command[1024];
+
+    /* xxx This should be more careful about only adding if it
+     * xxx actually exists, as opposed to always deleting it. */
+    snprintf(command, sizeof(command), POLICE_DEL_CMD, netdev_name);
+    if (system(command) == -1) {
+        VLOG_WARN_RL(&rl, "%s: problem removing policing", netdev_name);
+        return ECHILD;
+    }
+    return 0;
+}
+
 /* Attempts to set input rate limiting (policing) policy. */
 static int
 netdev_linux_set_policing(struct netdev *netdev,
@@ -1289,19 +1307,14 @@ netdev_linux_set_policing(struct netdev *netdev,
     char command[1024];
 
     COVERAGE_INC(netdev_set_policing);
+
+    netdev_linux_remove_policing(netdev);
     if (kbits_rate) {
         if (!kbits_burst) {
             /* Default to 1000 kilobits if not specified. */
             kbits_burst = 1000;
         }
 
-        /* xxx This should be more careful about only adding if it
-         * xxx actually exists, as opposed to always deleting it. */
-        snprintf(command, sizeof(command), POLICE_DEL_CMD, netdev_name);
-        if (system(command) == -1) {
-            VLOG_WARN_RL(&rl, "%s: problem removing policing", netdev_name);
-        }
-
         snprintf(command, sizeof(command), POLICE_ADD_CMD, netdev_name);
         if (system(command) != 0) {
             VLOG_WARN_RL(&rl, "%s: problem adding policing", netdev_name);
@@ -1315,11 +1328,6 @@ netdev_linux_set_policing(struct netdev *netdev,
                     netdev_name);
             return -1;
         }
-    } else {
-        snprintf(command, sizeof(command), POLICE_DEL_CMD, netdev_name);
-        if (system(command) == -1) {
-            VLOG_WARN_RL(&rl, "%s: problem removing policing", netdev_name);
-        }
     }
 
     return 0;