PROTO_TCP = 'tcp'
 PROTO_VLAN = 'vlan'
 
+SINGLE_VALUE = "singleValue"
+
+S_VLAN = 0
+C_VLAN = 1
+
+ETHER_TYPE_802_1ad = '0x88a8'
+
 IP_VERSION_4_MASK = 24
 IP_VERSION_6_MASK = 64
 
                 traffic_param['outer_l2']['framesize'])
             srcmac = str(traffic_param.get('srcmac', '00:00:00:00:00:01'))
             dstmac = str(traffic_param.get('dstmac', '00:00:00:00:00:02'))
-            # NOTE(ralonsoh): add QinQ tagging when
-            # traffic_param['outer_l2']['QinQ'] exists.
-            # s_vlan = traffic_param['outer_l2']['QinQ']['S-VLAN']
-            # c_vlan = traffic_param['outer_l2']['QinQ']['C-VLAN']
+
+            if traffic_param['outer_l2']['QinQ']:
+                s_vlan = traffic_param['outer_l2']['QinQ']['S-VLAN']
+                c_vlan = traffic_param['outer_l2']['QinQ']['C-VLAN']
+
+                field_descriptor = self._get_field_in_stack_item(
+                    self._get_stack_item(fg_id, PROTO_ETHERNET)[0],
+                    'etherType')
+
+                self.ixnet.setMultiAttribute(field_descriptor,
+                                             '-auto', 'false',
+                                             '-singleValue', ETHER_TYPE_802_1ad,
+                                             '-fieldValue', ETHER_TYPE_802_1ad,
+                                             '-valueType', SINGLE_VALUE)
+
+                self._append_procotol_to_stack(
+                    PROTO_VLAN, config_element + '/stack:"ethernet-1"')
+                self._append_procotol_to_stack(
+                    PROTO_VLAN, config_element + '/stack:"ethernet-1"')
+
+                self._update_vlan_tag(fg_id, s_vlan, S_VLAN)
+                self._update_vlan_tag(fg_id, c_vlan, C_VLAN)
 
             self.ixnet.setMultiAttribute(
                 config_element + '/transmissionControl',
                 self._get_stack_item(fg_id, PROTO_ETHERNET)[0],
                 'sourceAddress', srcmac)
 
+    def _update_vlan_tag(self, fg_id, params, vlan=0):
+        field_to_param_map = {
+            'vlanUserPriority': 'priority',
+            'cfi': 'cfi',
+            'vlanID': 'id'
+        }
+        for field, param in field_to_param_map.items():
+            value = params.get(param)
+            if value:
+                field_descriptor = self._get_field_in_stack_item(
+                    self._get_stack_item(fg_id, PROTO_VLAN)[vlan],
+                    field)
+
+                self.ixnet.setMultiAttribute(field_descriptor,
+                                             '-auto', 'false',
+                                             '-singleValue', value,
+                                             '-fieldValue', value,
+                                             '-valueType', SINGLE_VALUE)
+
+        self.ixnet.commit()
+
     def _update_ipv4_address(self, ip_descriptor, field, ip_address, seed,
                              mask, count):
         """Set the IPv4 address in a config element stack IP field
 
 import IxNetwork
 import unittest
 
+from copy import deepcopy
+
 from yardstick.common import exceptions
 from yardstick.network_services.libs.ixia_libs.ixnet import ixnet_api
 
         'rate': 10000.5,
         'rate_unit': 'fps',
         'outer_l2': {
-            'framesize': {'64B': '25', '256B': '75'}
+            'framesize': {'64B': '25', '256B': '75'},
+            'QinQ': None
         },
         'outer_l3': {
             'count': 512,
         'rate': 75.2,
         'rate_unit': '%',
         'outer_l2': {
-            'framesize': {'128B': '35', '1024B': '65'}
+            'framesize': {'128B': '35', '1024B': '65'},
+            'QinQ': None
         },
         'outer_l3': {
             'count': 1024,
                       '-type', 'continuous', '-duration', 50)
         ])
 
+    def test_update_frame_qinq(self):
+        with mock.patch.object(self.ixnet_gen,
+                               '_get_config_element_by_flow_group_name',
+                               return_value='cfg_element'), \
+             mock.patch.object(self.ixnet_gen, '_update_frame_mac'),\
+             mock.patch.object(self.ixnet_gen, '_get_stack_item',
+                               return_value='item'), \
+             mock.patch.object(self.ixnet_gen, '_get_field_in_stack_item',
+                               return_value='field'):
+
+            traffic_parameters = deepcopy(TRAFFIC_PARAMETERS)
+            traffic_parameters[UPLINK]['outer_l2']['QinQ'] = {
+                'S-VLAN': {'id': 128,
+                           'priority': 1,
+                           'cfi': 0},
+                'C-VLAN': {'id': 512,
+                           'priority': 0,
+                           'cfi': 2}
+            }
+
+            self.ixnet_gen.update_frame(traffic_parameters, 50)
+
+        self.ixnet_gen.ixnet.setMultiAttribute.assert_has_calls([
+            mock.call('field', '-auto', 'false', '-singleValue', '0x88a8',
+                      '-fieldValue', '0x88a8', '-valueType', 'singleValue'),
+            mock.call('field', '-auto', 'false', '-singleValue', 1,
+                      '-fieldValue', 1, '-valueType', 'singleValue'),
+            mock.call('field', '-auto', 'false', '-singleValue', 128,
+                      '-fieldValue', 128, '-valueType', 'singleValue'),
+            mock.call('field', '-auto', 'false', '-singleValue', 512,
+                      '-fieldValue', 512, '-valueType', 'singleValue'),
+            mock.call('field', '-auto', 'false', '-singleValue', 2,
+                      '-fieldValue', 2, '-valueType', 'singleValue')
+        ], any_order=True)
+
     def test_update_frame_flow_not_present(self):
         with mock.patch.object(
                 self.ixnet_gen, '_get_config_element_by_flow_group_name',