diff --git a/doc/source/cli/command-objects/port.rst b/doc/source/cli/command-objects/port.rst
index b3f4c7f9fd..2102288bd4 100644
--- a/doc/source/cli/command-objects/port.rst
+++ b/doc/source/cli/command-objects/port.rst
@@ -232,6 +232,7 @@ Set port properties
         [--dns-name <dns-name>]
         [--allowed-address ip-address=<ip-address>[,mac-address=<mac-address>]]
         [--no-allowed-address]
+        [--data-plane-status <status>]
         <port>
 
 .. option:: --description <description>
@@ -335,6 +336,12 @@ Set port properties
     (Specify both --allowed-address and --no-allowed-address
     to overwrite the current allowed-address pairs)
 
+.. option:: --data-plane-status
+
+    Set data plane status of this port (ACTIVE | DOWN).
+    Unset it to None with the 'port unset' command
+    (requires data plane status extension)
+
 .. _port_set-port:
 .. describe:: <port>
 
@@ -370,6 +377,7 @@ Unset port properties
         [--security-group <security-group> [...]]
         [--allowed-address ip-address=<ip-address>[,mac-address=<mac-address>] [...]]
         [--qos-policy]
+        [--data-plane-status]
         <port>
 
 .. option:: --fixed-ip subnet=<subnet>,ip-address=<ip-address>
@@ -398,6 +406,10 @@ Unset port properties
 
     Remove the QoS policy attached to the port
 
+.. option:: --data-plane-status
+
+    Clear existing information of data plane status
+
 .. _port_unset-port:
 .. describe:: <port>
 
diff --git a/openstackclient/network/v2/port.py b/openstackclient/network/v2/port.py
index 42291bf219..1409a194be 100644
--- a/openstackclient/network/v2/port.py
+++ b/openstackclient/network/v2/port.py
@@ -685,6 +685,15 @@ class SetPort(command.Command):
                    "(Specify both --allowed-address and --no-allowed-address"
                    "to overwrite the current allowed-address pairs)")
         )
+        parser.add_argument(
+            '--data-plane-status',
+            metavar='<status>',
+            choices=['ACTIVE', 'DOWN'],
+            help=_("Set data plane status of this port (ACTIVE | DOWN). "
+                   "Unset it to None with the 'port unset' command "
+                   "(requires data plane status extension)")
+        )
+
         return parser
 
     def take_action(self, parsed_args):
@@ -737,6 +746,8 @@ class SetPort(command.Command):
             attrs['allowed_address_pairs'].extend(
                 _convert_address_pairs(parsed_args)
             )
+        if parsed_args.data_plane_status:
+            attrs['data_plane_status'] = parsed_args.data_plane_status
 
         client.update_port(obj, **attrs)
 
@@ -816,6 +827,11 @@ class UnsetPort(command.Command):
             default=False,
             help=_("Remove the QoS policy attached to the port")
         )
+        parser.add_argument(
+            '--data-plane-status',
+            action='store_true',
+            help=_("Clear existing information of data plane status")
+        )
 
         return parser
 
@@ -867,6 +883,8 @@ class UnsetPort(command.Command):
             attrs['allowed_address_pairs'] = tmp_addr_pairs
         if parsed_args.qos_policy:
             attrs['qos_policy_id'] = None
+        if parsed_args.data_plane_status:
+            attrs['data_plane_status'] = None
 
         if attrs:
             client.update_port(obj, **attrs)
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index 0b8eee90b0..98bda1649f 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -558,6 +558,7 @@ class FakePort(object):
             'binding:vif_details': {},
             'binding:vif_type': 'ovs',
             'binding:vnic_type': 'normal',
+            'data_plane_status': None,
             'description': 'description-' + uuid.uuid4().hex,
             'device_id': 'device-id-' + uuid.uuid4().hex,
             'device_owner': 'compute:nova',
diff --git a/openstackclient/tests/unit/network/v2/test_port.py b/openstackclient/tests/unit/network/v2/test_port.py
index 851bf25ad2..a8a6dba9be 100644
--- a/openstackclient/tests/unit/network/v2/test_port.py
+++ b/openstackclient/tests/unit/network/v2/test_port.py
@@ -44,6 +44,7 @@ class TestPort(network_fakes.TestNetworkV2):
             'binding_vif_details',
             'binding_vif_type',
             'binding_vnic_type',
+            'data_plane_status',
             'description',
             'device_id',
             'device_owner',
@@ -70,6 +71,7 @@ class TestPort(network_fakes.TestNetworkV2):
             utils.format_dict(fake_port.binding_vif_details),
             fake_port.binding_vif_type,
             fake_port.binding_vnic_type,
+            fake_port.data_plane_status,
             fake_port.description,
             fake_port.device_id,
             fake_port.device_owner,
@@ -1371,6 +1373,40 @@ class TestSetPort(TestPort):
         self.network.update_port.assert_called_once_with(_testport, **attrs)
         self.assertIsNone(result)
 
+    def test_set_port_data_plane_status(self):
+        _testport = network_fakes.FakePort.create_one_port(
+            {'data_plane_status': None})
+        self.network.find_port = mock.Mock(return_value=_testport)
+        arglist = [
+            '--data-plane-status', 'ACTIVE',
+            _testport.name,
+        ]
+        verifylist = [
+            ('data_plane_status', 'ACTIVE'),
+            ('port', _testport.name),
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        result = self.cmd.take_action(parsed_args)
+
+        attrs = {
+            'data_plane_status': 'ACTIVE',
+        }
+
+        self.network.update_port.assert_called_once_with(_testport, **attrs)
+        self.assertIsNone(result)
+
+    def test_set_port_invalid_data_plane_status_value(self):
+        arglist = [
+            '--data-plane-status', 'Spider-Man',
+            'test-port',
+        ]
+        self.assertRaises(tests_utils.ParserException,
+                          self.check_parser,
+                          self.cmd,
+                          arglist,
+                          None)
+
 
 class TestShowPort(TestPort):
 
@@ -1573,3 +1609,26 @@ class TestUnsetPort(TestPort):
         self.assertRaises(exceptions.CommandError,
                           self.cmd.take_action,
                           parsed_args)
+
+    def test_unset_port_data_plane_status(self):
+        _fake_port = network_fakes.FakePort.create_one_port(
+            {'data_plane_status': 'ACTIVE'})
+        self.network.find_port = mock.Mock(return_value=_fake_port)
+        arglist = [
+            '--data-plane-status',
+            _fake_port.name,
+        ]
+        verifylist = [
+            ('data_plane_status', True),
+            ('port', _fake_port.name),
+        ]
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        result = self.cmd.take_action(parsed_args)
+
+        attrs = {
+            'data_plane_status': None,
+        }
+
+        self.network.update_port.assert_called_once_with(_fake_port, **attrs)
+        self.assertIsNone(result)
diff --git a/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml b/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml
new file mode 100644
index 0000000000..3c63061f4d
--- /dev/null
+++ b/releasenotes/notes/bug-1684989-3bda158a822d2f73.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - Add ``--data-plane-status`` option to ``port set`` and ``port unset``
+    commands.
+    [Bug `1684989 <https://bugs.launchpad.net/bugs/1684989>`_]