summaryrefslogtreecommitdiff
path: root/cleopatre/application/managerd/src
diff options
context:
space:
mode:
authorCeline Buret2011-10-25 16:18:39 +0200
committerCeline Buret2011-11-04 17:51:12 +0100
commitf10f8db3e02e6255fb2f449641a560171960d9a5 (patch)
tree45854156b41c053a8f4928e0c7d631b8d33febd4 /cleopatre/application/managerd/src
parent2902b134b41464c8466e650fad8d55d3671be882 (diff)
cleo/{app,devkit,linux}: set pid-s of plcd & managerd at init, closes #2465
Managerd and plcd register their pid to plcdrv during initialization. This avoids to send an empty mme at boot.
Diffstat (limited to 'cleopatre/application/managerd/src')
-rw-r--r--cleopatre/application/managerd/src/bridge.c6
-rw-r--r--cleopatre/application/managerd/src/managerd.c22
-rw-r--r--cleopatre/application/managerd/src/mme_nl.c63
3 files changed, 82 insertions, 9 deletions
diff --git a/cleopatre/application/managerd/src/bridge.c b/cleopatre/application/managerd/src/bridge.c
index 3d6c13a973..a72f943088 100644
--- a/cleopatre/application/managerd/src/bridge.c
+++ b/cleopatre/application/managerd/src/bridge.c
@@ -220,9 +220,9 @@ int bridge_init(struct managerd_ctx *ctx)
//Bind LO socket to this interface
if(-1 == (bind(ctx->sock_lo, (struct sockaddr *)&sll, sizeof(struct sockaddr_ll))))
{
- syslog(LOG_WARNING, "cannot bind raw socket to interface %s (%s)", LO_IFNAME, strerror(errno));
- close(ctx->sock_lo);
- close(ctx->sock_br);
+ syslog (LOG_WARNING, "cannot bind raw socket to interface %s (%s)", LO_IFNAME, strerror (errno));
+ close (ctx->sock_br);
+ close (ctx->sock_lo);
return -1;
}
diff --git a/cleopatre/application/managerd/src/managerd.c b/cleopatre/application/managerd/src/managerd.c
index 12dda3a488..abc6e6f68b 100644
--- a/cleopatre/application/managerd/src/managerd.c
+++ b/cleopatre/application/managerd/src/managerd.c
@@ -263,16 +263,28 @@ static int managerd_init(struct managerd_ctx *ctx)
return -1;
//Initialize mme part
- if(0 > mme_nl_init(ctx))
+ if (0 > mme_nl_init (ctx))
+ {
+ bridge_uninit (ctx);
return -1;
+ }
//Initialize simple connect part (open "/dev/gpio")
- if(0 > simple_connect_init(ctx))
+ if (0 > simple_connect_init (ctx))
+ {
+ bridge_uninit (ctx);
+ mme_nl_uninit (ctx);
return -1;
+ }
/* Initialize led part (need "/dev/gpio") */
if (0 > led_init (ctx))
+ {
+ bridge_uninit (ctx);
+ mme_nl_uninit (ctx);
+ simple_connect_uninit (ctx);
return -1;
+ }
/* Set default values of hpav.info file into managerd context */
strcpy (ctx->hpav_info.status, LIBSPID_HPAV_INFO_VALUE_STATUS_UNASSOCIATED);
@@ -290,7 +302,11 @@ static int managerd_init(struct managerd_ctx *ctx)
LIBSPID_HPAV_INFO_PATH, managerd_signal_handler))
{
syslog (LOG_WARNING, "libspid system file update register failed");
- return -1;
+ bridge_uninit (ctx);
+ mme_nl_uninit (ctx);
+ led_uninit (ctx);
+ simple_connect_uninit (ctx);
+ return -1;
}
return 0;
diff --git a/cleopatre/application/managerd/src/mme_nl.c b/cleopatre/application/managerd/src/mme_nl.c
index 07b38dd1e5..f089c18d62 100644
--- a/cleopatre/application/managerd/src/mme_nl.c
+++ b/cleopatre/application/managerd/src/mme_nl.c
@@ -36,8 +36,12 @@
#include <asm/byteorder.h>
#include <linux/netlink.h>
+#include "ioctl.h"
+
#include "mme_nl.h"
+#define PLC_IFNAME "plc0"
+
/**
* Receive a frame from MME interface.
*
@@ -145,8 +149,10 @@ int mme_nl_send(struct managerd_ctx *ctx, uint8_t *buffer, int len)
*/
int mme_nl_init(struct managerd_ctx *ctx)
{
- struct sockaddr_ll sll;
- struct ifreq ifr;
+ struct plcdrv_setpid user_data = {0};
+ struct ifreq ifr = {0};
+ int sock_plc;
+ struct sockaddr_ll plc_sll;
//Check arguments
assert(ctx != NULL);
@@ -163,9 +169,60 @@ int mme_nl_init(struct managerd_ctx *ctx)
ctx->mme_snl.nl_groups = 0; /* not in mcast group */
if (0 > bind(ctx->sock_mme, (struct sockaddr *)&ctx->mme_snl, sizeof(ctx->mme_snl)))
{
- syslog (LOG_WARNING, "cannot bind socket on %s (%s)", MME_IFNAME, strerror(errno));
+ syslog (LOG_WARNING, "cannot bind socket on %s (%s)", MME_IFNAME, strerror (errno));
+ close (ctx->sock_mme);
+ return -1;
+ }
+
+ /* Create a receive connection on PLC interface */
+ if (0 > (sock_plc = socket (AF_PACKET, SOCK_RAW, ETH_P_HPAV)))
+ {
+ syslog (LOG_WARNING, "cannot open socket on %s (%s)", PLC_IFNAME,
+ strerror (errno));
+ close (ctx->sock_mme);
+ return -1;
+ }
+
+ /* Prepare PLC socket address */
+ strncpy (ifr.ifr_name, (char*) PLC_IFNAME, IFNAMSIZ);
+ if (-1 == (ioctl (sock_plc, SIOCGIFINDEX, &ifr)))
+ {
+ syslog (LOG_WARNING, "cannot get interface %s index (%s)",
+ PLC_IFNAME, strerror (errno));
+ close (ctx->sock_mme);
+ close (sock_plc);
return -1;
}
+ plc_sll.sll_family = AF_PACKET;
+ plc_sll.sll_ifindex = ifr.ifr_ifindex;
+ plc_sll.sll_protocol = htons (ETH_P_HPAV);
+
+ /* Bind PLC socket to this interface */
+ if (-1 == (bind (sock_plc, (struct sockaddr *) &plc_sll,
+ sizeof (struct sockaddr_ll))))
+ {
+ syslog (LOG_WARNING, "cannot bind raw socket to interface %s (%s)",
+ PLC_IFNAME, strerror (errno));
+ close (ctx->sock_mme);
+ close (sock_plc);
+ return -1;
+ }
+
+ /* Set managerd pid for reception on mme netlink */
+ user_data.nl = NETLINK_PLC_MME;
+ user_data.pid = getpid ();
+ ifr.ifr_data = (void *) &user_data;
+ strncpy (ifr.ifr_name, (char*) PLC_IFNAME, IFNAMSIZ);
+ if (0 > (ioctl (sock_plc, PLCDRV_IOCTL_SETPID, &ifr)))
+ {
+ syslog (LOG_WARNING, "cannot call ioctl SETPID (%s)", strerror (errno));
+ close (ctx->sock_mme);
+ close (sock_plc);
+ return -1;
+ }
+
+ /* We do not need PLC connection anymore => close it. */
+ close (sock_plc);
return 0;
}