/*
 *
 *  Connection Manager
 *
 *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <errno.h>
#include <net/if.h>

#ifndef IFF_LOWER_UP
#define IFF_LOWER_UP	0x10000
#endif

#include <glib.h>

#define CONNMAN_API_SUBJECT_TO_CHANGE
#include <connman/technology.h>
#include <connman/plugin.h>
#include <connman/device.h>
#include <connman/rtnl.h>
#include <connman/inet.h>
#include <connman/log.h>

static bool gadget_tethering = false;

struct gadget_data {
	int index;
	unsigned flags;
	unsigned int watch;
	struct connman_network *network;
};

static int gadget_network_probe(struct connman_network *network)
{
	DBG("network %p", network);

	return 0;
}

static void gadget_network_remove(struct connman_network *network)
{
	DBG("network %p", network);
}

static int gadget_network_connect(struct connman_network *network)
{
	DBG("network %p", network);

	connman_network_set_connected(network, true);

	return 0;
}

static int gadget_network_disconnect(struct connman_network *network, bool user_initiated)
{
	DBG("network %p", network);

	connman_network_set_connected(network, false);

	return 0;
}

static struct connman_network_driver gadget_network_driver = {
	.name		= "usb",
	.type		= CONNMAN_NETWORK_TYPE_GADGET,
	.probe		= gadget_network_probe,
	.remove		= gadget_network_remove,
	.connect	= gadget_network_connect,
	.disconnect	= gadget_network_disconnect,
};

static void add_network(struct connman_device *device,
			struct gadget_data *gadget)
{
	struct connman_network *network;
	int index;

	network = connman_network_create("gadget",
					CONNMAN_NETWORK_TYPE_GADGET);
	if (!network)
		return;

	index = connman_device_get_index(device);
	connman_network_set_index(network, index);

	connman_network_set_name(network, "Wired");

	if (connman_device_add_network(device, network) < 0) {
		connman_network_unref(network);
		return;
	}

	if (!gadget_tethering)
		/*
		 * Prevent service from starting the reconnect
		 * procedure as we do not want the DHCP client
		 * to run when tethering.
		 */
		connman_network_set_group(network, "usb");

	gadget->network = network;
}

static void remove_network(struct connman_device *device,
				struct gadget_data *gadget)
{
	if (!gadget->network)
		return;

	connman_device_remove_network(device, gadget->network);
	connman_network_unref(gadget->network);

	gadget->network = NULL;
}

static void gadget_newlink(unsigned flags, unsigned change, void *user_data)
{
	struct connman_device *device = user_data;
	struct gadget_data *gadget = connman_device_get_data(device);
	if (!gadget)
		return;

	DBG("index %d flags %d change %d", gadget->index, flags, change);

	if ((gadget->flags & IFF_UP) != (flags & IFF_UP)) {
		if (flags & IFF_UP) {
			DBG("power on");
			connman_device_set_powered(device, true);
		} else {
			DBG("power off");
			connman_device_set_powered(device, false);
		}
	}

	if ((gadget->flags & IFF_LOWER_UP) != (flags & IFF_LOWER_UP)) {
		if (flags & IFF_LOWER_UP) {
			DBG("carrier on");
			add_network(device, gadget);
		} else {
			DBG("carrier off");
			remove_network(device, gadget);
		}
	}

	gadget->flags = flags;
}

static int gadget_dev_probe(struct connman_device *device)
{
	struct gadget_data *gadget;

	if (!device)
		return -EINVAL;

	DBG("device %p", device);

	gadget = g_try_new0(struct gadget_data, 1);
	if (!gadget)
		return -ENOMEM;

	connman_device_set_data(device, gadget);

	gadget->index = connman_device_get_index(device);
	gadget->flags = 0;

	gadget->watch = connman_rtnl_add_newlink_watch(gadget->index,
						gadget_newlink, device);

	return 0;
}

static void gadget_dev_remove(struct connman_device *device)
{
	struct gadget_data *gadget = connman_device_get_data(device);
	if (!gadget)
		return;

	DBG("device %p", device);

	connman_device_set_data(device, NULL);

	connman_rtnl_remove_watch(gadget->watch);

	remove_network(device, gadget);

	g_free(gadget);
}

static int gadget_dev_enable(struct connman_device *device)
{
	struct gadget_data *gadget;

	if (!device)
		return -EINVAL;

	gadget = connman_device_get_data(device);
	if (!gadget)
		return -ENXIO;

	DBG("device %p", device);

	return connman_inet_ifup(gadget->index);
}

static int gadget_dev_disable(struct connman_device *device)
{
	struct gadget_data *gadget;

	if (!device)
		return -EINVAL;

	gadget = connman_device_get_data(device);
	if (!gadget)
		return -ENXIO;

	DBG("device %p", device);

	return connman_inet_ifdown(gadget->index);
}

static struct connman_device_driver gadget_dev_driver = {
	.name		= "gadget",
	.type		= CONNMAN_DEVICE_TYPE_GADGET,
	.probe		= gadget_dev_probe,
	.remove		= gadget_dev_remove,
	.enable		= gadget_dev_enable,
	.disable	= gadget_dev_disable,
};

static GList *cdc_interface_list = NULL;

static void gadget_tech_add_interface(struct connman_technology *technology,
			int index, const char *name, const char *ident)
{
	DBG("index %d name %s ident %s", index, name, ident);

	if (g_list_find(cdc_interface_list, GINT_TO_POINTER((int)index)))
		return;

	cdc_interface_list = g_list_prepend(cdc_interface_list,
					(GINT_TO_POINTER((int) index)));
}

static void gadget_tech_remove_interface(struct connman_technology *technology,
								int index)
{
	DBG("index %d", index);

	cdc_interface_list = g_list_remove(cdc_interface_list,
					GINT_TO_POINTER((int) index));
}

static void gadget_tech_enable_tethering(struct connman_technology *technology,
						const char *bridge)
{
	GList *list;

	for (list = cdc_interface_list; list; list = list->next) {
		int index = GPOINTER_TO_INT(list->data);
		struct connman_device *device =
			connman_device_find_by_index(index);
		struct gadget_data *gadget;

		if (device) {
			gadget = connman_device_get_data(device);
			if (gadget)
				remove_network(device, gadget);
		}

		connman_technology_tethering_notify(technology, true);

		connman_inet_ifup(index);

		connman_inet_add_to_bridge(index, bridge);
	}
}

static void gadget_tech_disable_tethering(struct connman_technology *technology,
						const char *bridge)
{
	GList *list;

	for (list = cdc_interface_list; list; list = list->next) {
		int index = GPOINTER_TO_INT(list->data);

		connman_inet_remove_from_bridge(index, bridge);

		connman_inet_ifdown(index);

		connman_technology_tethering_notify(technology, false);
	}
}

static int gadget_tech_set_tethering(struct connman_technology *technology,
				const char *identifier, const char *passphrase,
				const char *bridge, bool enabled)
{
	DBG("bridge %s enabled %d", bridge, enabled);

	if (enabled)
		gadget_tech_enable_tethering(technology, bridge);
	else
		gadget_tech_disable_tethering(technology, bridge);

	return 0;
}

static int gadget_tech_probe(struct connman_technology *technology)
{
	return 0;
}

static void gadget_tech_remove(struct connman_technology *technology)
{
	g_list_free(cdc_interface_list);

	cdc_interface_list = NULL;
}

static struct connman_technology_driver gadget_tech_driver = {
	.name			= "cdc_ethernet",
	.type			= CONNMAN_SERVICE_TYPE_GADGET,
	.probe			= gadget_tech_probe,
	.remove			= gadget_tech_remove,
	.add_interface		= gadget_tech_add_interface,
	.remove_interface	= gadget_tech_remove_interface,
	.set_tethering		= gadget_tech_set_tethering,
};

static int gadget_init(void)
{
	int err;

	err = connman_technology_driver_register(&gadget_tech_driver);
	if (err < 0) {
		return err;
	}

	err = connman_network_driver_register(&gadget_network_driver);
	if (err < 0)
		return err;

	err = connman_device_driver_register(&gadget_dev_driver);
	if (err < 0) {
		connman_technology_driver_unregister(&gadget_tech_driver);
		return err;
	}

	return 0;
}

static void gadget_exit(void)
{
	connman_technology_driver_unregister(&gadget_tech_driver);
	connman_network_driver_unregister(&gadget_network_driver);
	connman_device_driver_unregister(&gadget_dev_driver);
}

CONNMAN_PLUGIN_DEFINE(gadget, "Gadget interface plugin", VERSION,
		CONNMAN_PLUGIN_PRIORITY_DEFAULT, gadget_init, gadget_exit)
