aboutsummaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorAndre Carvalho de Matos <andre.carvalho.matos@stericsson.com>2010-10-20 18:28:09 +0200
committerJonas ABERG <jonas.aberg@stericsson.com>2011-05-05 07:58:03 +0200
commit1085d951c41a6d24978c38e9edf8ffc7252a7b42 (patch)
tree37d028401bd993afa62a7a12efe695615a2ef7ff /net
parent606308eebd1eafb2ac7aab37dd8468e0d7b84db4 (diff)
CAIF: Fixed bindtodevice from set socket options
Change-Id: I794783fb03e5514824cdbfebce786aaf50f33a9e Signed-off-by: Erwan Bracq <erwan.bracq@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21530 Reviewed-by: QATEST Reviewed-by: Jonas ABERG <jonas.aberg@stericsson.com>
Diffstat (limited to 'net')
-rw-r--r--net/caif/caif_config_util.c5
-rw-r--r--net/caif/caif_socket.c19
-rw-r--r--net/caif/cfcnfg.c14
3 files changed, 11 insertions, 27 deletions
diff --git a/net/caif/caif_config_util.c b/net/caif/caif_config_util.c
index d436bf26826..8794bf4e39b 100644
--- a/net/caif/caif_config_util.c
+++ b/net/caif/caif_config_util.c
@@ -21,8 +21,9 @@ int caif_connect_req_to_link_param(struct cfcnfg *cnfg,
/* In caif protocol low value is high priority */
l->priority = CAIF_PRIO_MAX - s->priority + 1;
- if (s->link_name[0] != '\0')
- l->phyid = cfcnfg_get_named(cnfg, s->link_name);
+ if (s->ifindex != 0){
+ l->phyid = cfcnfg_get_id_from_ifi(cnfg, s->ifindex);
+ }
else {
switch (s->link_selector) {
case CAIF_LINK_HIGH_BANDW:
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index f7b8563c65b..a514075475f 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -688,7 +688,6 @@ static int setsockopt(struct socket *sock,
struct sock *sk = sock->sk;
struct caifsock *cf_sk = container_of(sk, struct caifsock, sk);
int linksel;
- struct ifreq ifreq;
if (cf_sk->sk.sk_socket->state != SS_UNCONNECTED)
return -ENOPROTOOPT;
@@ -706,21 +705,6 @@ static int setsockopt(struct socket *sock,
release_sock(&cf_sk->sk);
return 0;
- case SO_BINDTODEVICE:
- if (lvl != SOL_SOCKET)
- goto bad_sol;
- if (ol < sizeof(struct ifreq))
- return -EINVAL;
- if (copy_from_user(&ifreq, ov, sizeof(ifreq)))
- return -EFAULT;
- lock_sock(&(cf_sk->sk));
- strncpy(cf_sk->conn_req.link_name, ifreq.ifr_name,
- sizeof(cf_sk->conn_req.link_name));
- cf_sk->conn_req.link_name
- [sizeof(cf_sk->conn_req.link_name)-1] = 0;
- release_sock(&cf_sk->sk);
- return 0;
-
case CAIFSO_REQ_PARAM:
if (lvl != SOL_CAIF)
goto bad_sol;
@@ -850,6 +834,9 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr,
else
cf_sk->conn_req.priority = cf_sk->sk.sk_priority;
+ /*ifindex = id of the interface.*/
+ cf_sk->conn_req.ifindex = cf_sk->sk.sk_bound_dev_if;
+
dbfs_atomic_inc(&cnt.num_connect_req);
cf_sk->layer.receive = caif_sktrecv_cb;
err = caif_connect_client(&cf_sk->conn_req,
diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c
index c02fa02671e..02c0b6c3b46 100644
--- a/net/caif/cfcnfg.c
+++ b/net/caif/cfcnfg.c
@@ -173,17 +173,13 @@ static struct cfcnfg_phyinfo *cfcnfg_get_phyinfo(struct cfcnfg *cnfg,
return NULL;
}
-int cfcnfg_get_named(struct cfcnfg *cnfg, char *name)
+int cfcnfg_get_id_from_ifi(struct cfcnfg *cnfg, int ifi)
{
int i;
-
- /* Try to match with specified name */
- for (i = 0; i < MAX_PHY_LAYERS; i++) {
- if (cnfg->phy_layers[i].frm_layer != NULL
- && strcmp(cnfg->phy_layers[i].phy_layer->name,
- name) == 0)
- return cnfg->phy_layers[i].frm_layer->id;
- }
+ for (i = 0; i < MAX_PHY_LAYERS; i++)
+ if (cnfg->phy_layers[i].frm_layer != NULL &&
+ cnfg->phy_layers[i].ifindex == ifi)
+ return i;
return 0;
}