summaryrefslogtreecommitdiffstats
path: root/plugins/ste.c
diff options
context:
space:
mode:
authorSjur Brændeland <sjur.brandeland@stericsson.com>2010-08-17 14:22:33 +0200
committerMarcel Holtmann <marcel@holtmann.org>2010-08-17 14:46:01 +0200
commit825a2c2d665fbae98fb75b843c6584a6f2082996 (patch)
tree5ea1d91fd9c831e96699c9def36f200ff90648c9 /plugins/ste.c
parente006d6db04284ed181d736b95b1d4fd746296e95 (diff)
downloadofono-825a2c2d665fbae98fb75b843c6584a6f2082996.tar.bz2
ste: Use SOCK_STREAM for CAIF and enable interface specification
Diffstat (limited to 'plugins/ste.c')
-rw-r--r--plugins/ste.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/plugins/ste.c b/plugins/ste.c
index 39221611..0dcb7f50 100644
--- a/plugins/ste.c
+++ b/plugins/ste.c
@@ -30,6 +30,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <net/if.h>
#include <glib.h>
#include <gatchat.h>
@@ -123,14 +124,31 @@ static int ste_enable(struct ofono_modem *modem)
if (!device) {
struct sockaddr_caif addr;
int err;
+ const char *interface;
/* Create a CAIF socket for AT Service */
- fd = socket(AF_CAIF, SOCK_SEQPACKET, CAIFPROTO_AT);
+ fd = socket(AF_CAIF, SOCK_STREAM, CAIFPROTO_AT);
if (fd < 0) {
ofono_error("Failed to create CAIF socket for AT");
return -EIO;
}
+ /* Bind CAIF socket to specified interface */
+ interface = ofono_modem_get_string(modem, "Interface");
+ if (interface) {
+ struct ifreq ifreq;
+ memset(&ifreq, 0, sizeof(ifreq));
+ strcpy(ifreq.ifr_name, interface);
+ err = setsockopt(fd, SOL_SOCKET,
+ SO_BINDTODEVICE, &ifreq, sizeof(ifreq));
+ if (err < 0) {
+ ofono_error("Failed to bind caif socket "
+ "to interface");
+ close(fd);
+ return err;
+ }
+ }
+
memset(&addr, 0, sizeof(addr));
addr.family = AF_CAIF;
addr.u.at.type = CAIF_ATTYPE_PLAIN;