+/* read from OpenBSC via MNCC socket */
+static int mncc_fd_read(struct lcr_fd *lfd, void *inst, int idx)
+{
+ int rc;
+ static char buf[sizeof(struct gsm_mncc)+1024];
+ struct gsm_mncc *mncc_prim = (struct gsm_mncc *) buf;
+
+ memset(buf, 0, sizeof(buf));
+ rc = recv(lfd->fd, buf, sizeof(buf), 0);
+ if (rc == 0)
+ return mncc_fd_close(lfd);
+ if (rc < 0)
+ return rc;
+
+ /* Hand the MNCC message into LCR */
+ return message_bsc(NULL, mncc_prim->msg_type, mncc_prim);
+}
+
+/* file descriptor callback if we can read or write form MNCC socket */
+static int mncc_fd_cb(struct lcr_fd *lfd, unsigned int what, void *instance, int idx)
+{
+ int rc = 0;
+
+ if (what & LCR_FD_READ)
+ rc = mncc_fd_read(lfd, instance, idx);
+ if (rc < 0)
+ return rc;
+
+ if (what & LCR_FD_WRITE)
+ rc = mncc_fd_write(lfd, instance, idx);
+
+ return rc;
+}
+
+int gsm_bs_init(void)
+{
+ struct sockaddr_un sun;
+ int rc;
+
+ rc = socket(PF_UNIX, SOCK_SEQPACKET, 0);
+ if (rc < 0)
+ return rc;
+
+ gsm->mncc_lfd.fd = rc;
+
+ sun.sun_family = AF_UNIX;
+ strcpy(sun.sun_path, "/tmp/bsc_mncc");
+ rc = connect(rc, (struct sockaddr *)&sun, sizeof(sun));
+ if (rc < 0)
+ return rc;
+
+ rc = register_fd(&gsm->mncc_lfd, LCR_FD_READ, &mncc_fd_cb, NULL, 0);
+
+ return rc;
+}