diff options
| -rw-r--r-- | include/net/caif/caif_dev.h | 4 | ||||
| -rw-r--r-- | include/net/caif/cfcnfg.h | 8 | ||||
| -rw-r--r-- | net/caif/caif_config_util.c | 13 | ||||
| -rw-r--r-- | net/caif/caif_dev.c | 2 | ||||
| -rw-r--r-- | net/caif/caif_socket.c | 45 | ||||
| -rw-r--r-- | net/caif/cfcnfg.c | 17 | ||||
| -rw-r--r-- | net/caif/cfdbgl.c | 14 | ||||
| -rw-r--r-- | net/caif/cfrfml.c | 2 |
8 files changed, 55 insertions, 50 deletions
diff --git a/include/net/caif/caif_dev.h b/include/net/caif/caif_dev.h index 6da573c75d54..8eff83b95366 100644 --- a/include/net/caif/caif_dev.h +++ b/include/net/caif/caif_dev.h | |||
| @@ -28,7 +28,7 @@ struct caif_param { | |||
| 28 | * @sockaddr: Socket address to connect. | 28 | * @sockaddr: Socket address to connect. |
| 29 | * @priority: Priority of the connection. | 29 | * @priority: Priority of the connection. |
| 30 | * @link_selector: Link selector (high bandwidth or low latency) | 30 | * @link_selector: Link selector (high bandwidth or low latency) |
| 31 | * @link_name: Name of the CAIF Link Layer to use. | 31 | * @ifindex: kernel index of the interface. |
| 32 | * @param: Connect Request parameters (CAIF_SO_REQ_PARAM). | 32 | * @param: Connect Request parameters (CAIF_SO_REQ_PARAM). |
| 33 | * | 33 | * |
| 34 | * This struct is used when connecting a CAIF channel. | 34 | * This struct is used when connecting a CAIF channel. |
| @@ -39,7 +39,7 @@ struct caif_connect_request { | |||
| 39 | struct sockaddr_caif sockaddr; | 39 | struct sockaddr_caif sockaddr; |
| 40 | enum caif_channel_priority priority; | 40 | enum caif_channel_priority priority; |
| 41 | enum caif_link_selector link_selector; | 41 | enum caif_link_selector link_selector; |
| 42 | char link_name[16]; | 42 | int ifindex; |
| 43 | struct caif_param param; | 43 | struct caif_param param; |
| 44 | }; | 44 | }; |
| 45 | 45 | ||
diff --git a/include/net/caif/cfcnfg.h b/include/net/caif/cfcnfg.h index bd646faffa47..f688478bfb84 100644 --- a/include/net/caif/cfcnfg.h +++ b/include/net/caif/cfcnfg.h | |||
| @@ -139,10 +139,10 @@ struct dev_info *cfcnfg_get_phyid(struct cfcnfg *cnfg, | |||
| 139 | enum cfcnfg_phy_preference phy_pref); | 139 | enum cfcnfg_phy_preference phy_pref); |
| 140 | 140 | ||
| 141 | /** | 141 | /** |
| 142 | * cfcnfg_get_named() - Get the Physical Identifier of CAIF Link Layer | 142 | * cfcnfg_get_id_from_ifi() - Get the Physical Identifier of ifindex, |
| 143 | * it matches caif physical id with the kernel interface id. | ||
| 143 | * @cnfg: Configuration object | 144 | * @cnfg: Configuration object |
| 144 | * @name: Name of the Physical Layer (Caif Link Layer) | 145 | * @ifi: ifindex obtained from socket.c bindtodevice. |
| 145 | */ | 146 | */ |
| 146 | int cfcnfg_get_named(struct cfcnfg *cnfg, char *name); | 147 | int cfcnfg_get_id_from_ifi(struct cfcnfg *cnfg, int ifi); |
| 147 | |||
| 148 | #endif /* CFCNFG_H_ */ | 148 | #endif /* CFCNFG_H_ */ |
diff --git a/net/caif/caif_config_util.c b/net/caif/caif_config_util.c index 76ae68303d3a..d522d8c1703e 100644 --- a/net/caif/caif_config_util.c +++ b/net/caif/caif_config_util.c | |||
| @@ -16,11 +16,18 @@ int connect_req_to_link_param(struct cfcnfg *cnfg, | |||
| 16 | { | 16 | { |
| 17 | struct dev_info *dev_info; | 17 | struct dev_info *dev_info; |
| 18 | enum cfcnfg_phy_preference pref; | 18 | enum cfcnfg_phy_preference pref; |
| 19 | int res; | ||
| 20 | |||
| 19 | memset(l, 0, sizeof(*l)); | 21 | memset(l, 0, sizeof(*l)); |
| 20 | l->priority = s->priority; | 22 | /* In caif protocol low value is high priority */ |
| 23 | l->priority = CAIF_PRIO_MAX - s->priority + 1; | ||
| 21 | 24 | ||
| 22 | if (s->link_name[0] != '\0') | 25 | if (s->ifindex != 0){ |
| 23 | l->phyid = cfcnfg_get_named(cnfg, s->link_name); | 26 | res = cfcnfg_get_id_from_ifi(cnfg, s->ifindex); |
| 27 | if (res < 0) | ||
| 28 | return res; | ||
| 29 | l->phyid = res; | ||
| 30 | } | ||
| 24 | else { | 31 | else { |
| 25 | switch (s->link_selector) { | 32 | switch (s->link_selector) { |
| 26 | case CAIF_LINK_HIGH_BANDW: | 33 | case CAIF_LINK_HIGH_BANDW: |
diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c index b99369a055d1..a42a408306e4 100644 --- a/net/caif/caif_dev.c +++ b/net/caif/caif_dev.c | |||
| @@ -307,6 +307,8 @@ static int caif_device_notify(struct notifier_block *me, unsigned long what, | |||
| 307 | 307 | ||
| 308 | case NETDEV_UNREGISTER: | 308 | case NETDEV_UNREGISTER: |
| 309 | caifd = caif_get(dev); | 309 | caifd = caif_get(dev); |
| 310 | if (caifd == NULL) | ||
| 311 | break; | ||
| 310 | netdev_info(dev, "unregister\n"); | 312 | netdev_info(dev, "unregister\n"); |
| 311 | atomic_set(&caifd->state, what); | 313 | atomic_set(&caifd->state, what); |
| 312 | caif_device_destroy(dev); | 314 | caif_device_destroy(dev); |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 2eca2dd0000f..1bf0cf503796 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
| @@ -716,8 +716,7 @@ static int setsockopt(struct socket *sock, | |||
| 716 | { | 716 | { |
| 717 | struct sock *sk = sock->sk; | 717 | struct sock *sk = sock->sk; |
| 718 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); | 718 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
| 719 | int prio, linksel; | 719 | int linksel; |
| 720 | struct ifreq ifreq; | ||
| 721 | 720 | ||
| 722 | if (cf_sk->sk.sk_socket->state != SS_UNCONNECTED) | 721 | if (cf_sk->sk.sk_socket->state != SS_UNCONNECTED) |
| 723 | return -ENOPROTOOPT; | 722 | return -ENOPROTOOPT; |
| @@ -735,33 +734,6 @@ static int setsockopt(struct socket *sock, | |||
| 735 | release_sock(&cf_sk->sk); | 734 | release_sock(&cf_sk->sk); |
| 736 | return 0; | 735 | return 0; |
| 737 | 736 | ||
| 738 | case SO_PRIORITY: | ||
| 739 | if (lvl != SOL_SOCKET) | ||
| 740 | goto bad_sol; | ||
| 741 | if (ol < sizeof(int)) | ||
| 742 | return -EINVAL; | ||
| 743 | if (copy_from_user(&prio, ov, sizeof(int))) | ||
| 744 | return -EINVAL; | ||
| 745 | lock_sock(&(cf_sk->sk)); | ||
| 746 | cf_sk->conn_req.priority = prio; | ||
| 747 | release_sock(&cf_sk->sk); | ||
| 748 | return 0; | ||
| 749 | |||
| 750 | case SO_BINDTODEVICE: | ||
| 751 | if (lvl != SOL_SOCKET) | ||
| 752 | goto bad_sol; | ||
| 753 | if (ol < sizeof(struct ifreq)) | ||
| 754 | return -EINVAL; | ||
| 755 | if (copy_from_user(&ifreq, ov, sizeof(ifreq))) | ||
| 756 | return -EFAULT; | ||
| 757 | lock_sock(&(cf_sk->sk)); | ||
| 758 | strncpy(cf_sk->conn_req.link_name, ifreq.ifr_name, | ||
| 759 | sizeof(cf_sk->conn_req.link_name)); | ||
| 760 | cf_sk->conn_req.link_name | ||
| 761 | [sizeof(cf_sk->conn_req.link_name)-1] = 0; | ||
| 762 | release_sock(&cf_sk->sk); | ||
| 763 | return 0; | ||
| 764 | |||
| 765 | case CAIFSO_REQ_PARAM: | 737 | case CAIFSO_REQ_PARAM: |
| 766 | if (lvl != SOL_CAIF) | 738 | if (lvl != SOL_CAIF) |
| 767 | goto bad_sol; | 739 | goto bad_sol; |
| @@ -880,6 +852,18 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr, | |||
| 880 | sock->state = SS_CONNECTING; | 852 | sock->state = SS_CONNECTING; |
| 881 | sk->sk_state = CAIF_CONNECTING; | 853 | sk->sk_state = CAIF_CONNECTING; |
| 882 | 854 | ||
| 855 | /* Check priority value comming from socket */ | ||
| 856 | /* if priority value is out of range it will be ajusted */ | ||
| 857 | if (cf_sk->sk.sk_priority > CAIF_PRIO_MAX) | ||
| 858 | cf_sk->conn_req.priority = CAIF_PRIO_MAX; | ||
| 859 | else if (cf_sk->sk.sk_priority < CAIF_PRIO_MIN) | ||
| 860 | cf_sk->conn_req.priority = CAIF_PRIO_MIN; | ||
| 861 | else | ||
| 862 | cf_sk->conn_req.priority = cf_sk->sk.sk_priority; | ||
| 863 | |||
| 864 | /*ifindex = id of the interface.*/ | ||
| 865 | cf_sk->conn_req.ifindex = cf_sk->sk.sk_bound_dev_if; | ||
| 866 | |||
| 883 | dbfs_atomic_inc(&cnt.num_connect_req); | 867 | dbfs_atomic_inc(&cnt.num_connect_req); |
| 884 | cf_sk->layer.receive = caif_sktrecv_cb; | 868 | cf_sk->layer.receive = caif_sktrecv_cb; |
| 885 | err = caif_connect_client(&cf_sk->conn_req, | 869 | err = caif_connect_client(&cf_sk->conn_req, |
| @@ -905,6 +889,7 @@ static int caif_connect(struct socket *sock, struct sockaddr *uaddr, | |||
| 905 | cf_sk->maxframe = mtu - (headroom + tailroom); | 889 | cf_sk->maxframe = mtu - (headroom + tailroom); |
| 906 | if (cf_sk->maxframe < 1) { | 890 | if (cf_sk->maxframe < 1) { |
| 907 | pr_warn("CAIF Interface MTU too small (%d)\n", dev->mtu); | 891 | pr_warn("CAIF Interface MTU too small (%d)\n", dev->mtu); |
| 892 | err = -ENODEV; | ||
| 908 | goto out; | 893 | goto out; |
| 909 | } | 894 | } |
| 910 | 895 | ||
| @@ -1142,7 +1127,7 @@ static int caif_create(struct net *net, struct socket *sock, int protocol, | |||
| 1142 | set_rx_flow_on(cf_sk); | 1127 | set_rx_flow_on(cf_sk); |
| 1143 | 1128 | ||
| 1144 | /* Set default options on configuration */ | 1129 | /* Set default options on configuration */ |
| 1145 | cf_sk->conn_req.priority = CAIF_PRIO_NORMAL; | 1130 | cf_sk->sk.sk_priority= CAIF_PRIO_NORMAL; |
| 1146 | cf_sk->conn_req.link_selector = CAIF_LINK_LOW_LATENCY; | 1131 | cf_sk->conn_req.link_selector = CAIF_LINK_LOW_LATENCY; |
| 1147 | cf_sk->conn_req.protocol = protocol; | 1132 | cf_sk->conn_req.protocol = protocol; |
| 1148 | /* Increase the number of sockets created. */ | 1133 | /* Increase the number of sockets created. */ |
diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c index 41adafd18914..21ede141018a 100644 --- a/net/caif/cfcnfg.c +++ b/net/caif/cfcnfg.c | |||
| @@ -173,18 +173,15 @@ static struct cfcnfg_phyinfo *cfcnfg_get_phyinfo(struct cfcnfg *cnfg, | |||
| 173 | return NULL; | 173 | return NULL; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | int cfcnfg_get_named(struct cfcnfg *cnfg, char *name) | 176 | |
| 177 | int cfcnfg_get_id_from_ifi(struct cfcnfg *cnfg, int ifi) | ||
| 177 | { | 178 | { |
| 178 | int i; | 179 | int i; |
| 179 | 180 | for (i = 0; i < MAX_PHY_LAYERS; i++) | |
| 180 | /* Try to match with specified name */ | 181 | if (cnfg->phy_layers[i].frm_layer != NULL && |
| 181 | for (i = 0; i < MAX_PHY_LAYERS; i++) { | 182 | cnfg->phy_layers[i].ifindex == ifi) |
| 182 | if (cnfg->phy_layers[i].frm_layer != NULL | 183 | return i; |
| 183 | && strcmp(cnfg->phy_layers[i].phy_layer->name, | 184 | return -ENODEV; |
| 184 | name) == 0) | ||
| 185 | return cnfg->phy_layers[i].frm_layer->id; | ||
| 186 | } | ||
| 187 | return 0; | ||
| 188 | } | 185 | } |
| 189 | 186 | ||
| 190 | int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, struct cflayer *adap_layer) | 187 | int cfcnfg_disconn_adapt_layer(struct cfcnfg *cnfg, struct cflayer *adap_layer) |
diff --git a/net/caif/cfdbgl.c b/net/caif/cfdbgl.c index 496fda9ac66f..11a2af4c162a 100644 --- a/net/caif/cfdbgl.c +++ b/net/caif/cfdbgl.c | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | #include <net/caif/cfsrvl.h> | 12 | #include <net/caif/cfsrvl.h> |
| 13 | #include <net/caif/cfpkt.h> | 13 | #include <net/caif/cfpkt.h> |
| 14 | 14 | ||
| 15 | #define container_obj(layr) ((struct cfsrvl *) layr) | ||
| 16 | |||
| 15 | static int cfdbgl_receive(struct cflayer *layr, struct cfpkt *pkt); | 17 | static int cfdbgl_receive(struct cflayer *layr, struct cfpkt *pkt); |
| 16 | static int cfdbgl_transmit(struct cflayer *layr, struct cfpkt *pkt); | 18 | static int cfdbgl_transmit(struct cflayer *layr, struct cfpkt *pkt); |
| 17 | 19 | ||
| @@ -38,5 +40,17 @@ static int cfdbgl_receive(struct cflayer *layr, struct cfpkt *pkt) | |||
| 38 | 40 | ||
| 39 | static int cfdbgl_transmit(struct cflayer *layr, struct cfpkt *pkt) | 41 | static int cfdbgl_transmit(struct cflayer *layr, struct cfpkt *pkt) |
| 40 | { | 42 | { |
| 43 | struct cfsrvl *service = container_obj(layr); | ||
| 44 | struct caif_payload_info *info; | ||
| 45 | int ret; | ||
| 46 | |||
| 47 | if (!cfsrvl_ready(service, &ret)) | ||
| 48 | return ret; | ||
| 49 | |||
| 50 | /* Add info for MUX-layer to route the packet out */ | ||
| 51 | info = cfpkt_info(pkt); | ||
| 52 | info->channel_id = service->layer.id; | ||
| 53 | info->dev_info = &service->dev_info; | ||
| 54 | |||
| 41 | return layr->dn->transmit(layr->dn, pkt); | 55 | return layr->dn->transmit(layr->dn, pkt); |
| 42 | } | 56 | } |
diff --git a/net/caif/cfrfml.c b/net/caif/cfrfml.c index bde8481e8d25..e2fb5fa75795 100644 --- a/net/caif/cfrfml.c +++ b/net/caif/cfrfml.c | |||
| @@ -193,7 +193,7 @@ out: | |||
| 193 | 193 | ||
| 194 | static int cfrfml_transmit_segment(struct cfrfml *rfml, struct cfpkt *pkt) | 194 | static int cfrfml_transmit_segment(struct cfrfml *rfml, struct cfpkt *pkt) |
| 195 | { | 195 | { |
| 196 | caif_assert(cfpkt_getlen(pkt) >= rfml->fragment_size); | 196 | caif_assert(cfpkt_getlen(pkt) < rfml->fragment_size); |
| 197 | 197 | ||
| 198 | /* Add info for MUX-layer to route the packet out. */ | 198 | /* Add info for MUX-layer to route the packet out. */ |
| 199 | cfpkt_info(pkt)->channel_id = rfml->serv.layer.id; | 199 | cfpkt_info(pkt)->channel_id = rfml->serv.layer.id; |
