def process_ip_frame(self,
                         id=None,
                         msg=None):
        """process_ip_frame

        Convert a complex nested json dictionary
        to a flattened dictionary and capture
        all unique keys for table construction

        :param id: key for this msg
        :param msg: ip frame for packet
        """

        # normalize into a dataframe
        df = json_normalize(msg)
        # convert to a flattened dictionary
        dt = json.loads(df.to_json())

        flat_msg = {}

        for k in dt:
            new_key = "ip_{}".format(k)
            flat_msg[new_key] = dt[k]["0"]
            if new_key not in self.ip_keys:
                self.ip_keys[new_key] = k
        # end of capturing all unique keys

        dt["ip_id"] = id
        self.all_ip.append(dt)

        log.debug("IP data updated:")
        log.debug(self.ip_keys)
        log.debug(self.all_ip)
        log.debug("")

        return flat_msg
process_ip_frame

        Convert a complex nested json dictionary
        to a flattened dictionary and capture
        all unique keys for table construction

        :param id: key for this msg
        :param msg: ip frame for packet