Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89da1ecf authored by Samuel Ortiz's avatar Samuel Ortiz Committed by David S. Miller
Browse files

[IrDA]: Netlink layer.



First IrDA configuration netlink layer implementation.
Currently, we only support the set/get mode commands.

Signed-off-by: default avatarSamuel Ortiz <samuel@sortiz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8c644623
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -216,6 +216,33 @@ struct if_irda_req {
#define ifr_dtr       ifr_ifru.ifru_line.dtr
#define ifr_rts       ifr_ifru.ifru_line.rts


/* IrDA netlink definitions */
#define IRDA_NL_NAME "irda"
#define IRDA_NL_VERSION 1

enum irda_nl_commands {
	IRDA_NL_CMD_UNSPEC,
	IRDA_NL_CMD_SET_MODE,
	IRDA_NL_CMD_GET_MODE,

	__IRDA_NL_CMD_AFTER_LAST
};
#define IRDA_NL_CMD_MAX (__IRDA_NL_CMD_AFTER_LAST - 1)

enum nl80211_attrs {
	IRDA_NL_ATTR_UNSPEC,
	IRDA_NL_ATTR_IFNAME,
	IRDA_NL_ATTR_MODE,

	__IRDA_NL_ATTR_AFTER_LAST
};
#define IRDA_NL_ATTR_MAX (__IRDA_NL_ATTR_AFTER_LAST - 1)

/* IrDA modes */
#define IRDA_MODE_PRIMARY   0x1
#define IRDA_MODE_SECONDARY 0x2

#endif /* KERNEL_IRDA_H */


+3 −0
Original line number Diff line number Diff line
@@ -125,6 +125,9 @@ extern void irda_sysctl_unregister(void);
extern int irsock_init(void);
extern void irsock_cleanup(void);

extern int irda_nl_register(void);
extern void irda_nl_unregister(void);

extern int irlap_driver_rcv(struct sk_buff *skb, struct net_device *dev,
			    struct packet_type *ptype,
			    struct net_device *orig_dev);
+2 −0
Original line number Diff line number Diff line
@@ -208,6 +208,8 @@ struct irlap_cb {
	int    xbofs_delay;   /* Nr of XBOF's used to MTT */
	int    bofs_count;    /* Negotiated extra BOFs */
	int    next_bofs;     /* Negotiated extra BOFs after next frame */

	int    mode;     /* IrLAP mode (primary, secondary or monitor) */
};

/* 
+1 −1
Original line number Diff line number Diff line
@@ -10,6 +10,6 @@ obj-$(CONFIG_IRCOMM) += ircomm/
irda-y := iriap.o iriap_event.o irlmp.o irlmp_event.o irlmp_frame.o \
          irlap.o irlap_event.o irlap_frame.o timer.o qos.o irqueue.o \
          irttp.o irda_device.o irias_object.o wrapper.o af_irda.o \
	  discovery.o parameters.o irmod.o
	  discovery.o parameters.o irnetlink.o irmod.o
irda-$(CONFIG_PROC_FS) += irproc.o
irda-$(CONFIG_SYSCTL) += irsysctl.o
+44 −4
Original line number Diff line number Diff line
@@ -88,16 +88,23 @@ EXPORT_SYMBOL(irda_notify_init);
 */
static int __init irda_init(void)
{
	int ret = 0;

	IRDA_DEBUG(0, "%s()\n", __FUNCTION__);

	/* Lower layer of the stack */
	irlmp_init();
	irlap_init();

	/* Driver/dongle support */
	irda_device_init();

	/* Higher layers of the stack */
	iriap_init();
	irttp_init();
	irsock_init();
	ret = irsock_init();
	if (ret < 0)
		goto out_err_1;

	/* Add IrDA packet type (Start receiving packets) */
	dev_add_pack(&irda_packet_type);
@@ -107,13 +114,44 @@ static int __init irda_init(void)
	irda_proc_register();
#endif
#ifdef CONFIG_SYSCTL
	irda_sysctl_register();
	ret = irda_sysctl_register();
	if (ret < 0)
		goto out_err_2;
#endif

	/* Driver/dongle support */
	irda_device_init();
	ret = irda_nl_register();
	if (ret < 0)
		goto out_err_3;

	return 0;

 out_err_3:
#ifdef CONFIG_SYSCTL
	irda_sysctl_unregister();
#endif
 out_err_2:
#ifdef CONFIG_PROC_FS
	irda_proc_unregister();
#endif

	/* Remove IrDA packet type (stop receiving packets) */
	dev_remove_pack(&irda_packet_type);

	/* Remove higher layers */
	irsock_cleanup();
 out_err_1:
	irttp_cleanup();
	iriap_cleanup();

	/* Remove lower layers */
	irda_device_cleanup();
	irlap_cleanup(); /* Must be done before irlmp_cleanup()! DB */

	/* Remove middle layer */
	irlmp_cleanup();


	return ret;
}

/*
@@ -125,6 +163,8 @@ static int __init irda_init(void)
static void __exit irda_cleanup(void)
{
	/* Remove External APIs */
	irda_nl_unregister();

#ifdef CONFIG_SYSCTL
	irda_sysctl_unregister();
#endif
Loading