caif: precedence bug
[linux-2.6.git] / net / caif / caif_config_util.c
1 /*
2  * Copyright (C) ST-Ericsson AB 2010
3  * Author:      Sjur Brendeland sjur.brandeland@stericsson.com
4  * License terms: GNU General Public License (GPL) version 2
5  */
6
7 #include <linux/module.h>
8 #include <linux/spinlock.h>
9 #include <net/caif/cfctrl.h>
10 #include <net/caif/cfcnfg.h>
11 #include <net/caif/caif_dev.h>
12
13 int connect_req_to_link_param(struct cfcnfg *cnfg,
14                                 struct caif_connect_request *s,
15                                 struct cfctrl_link_param *l)
16 {
17         struct dev_info *dev_info;
18         enum cfcnfg_phy_preference pref;
19         memset(l, 0, sizeof(*l));
20         l->priority = s->priority;
21
22         if (s->link_name[0] != '\0')
23                 l->phyid = cfcnfg_get_named(cnfg, s->link_name);
24         else {
25                 switch (s->link_selector) {
26                 case CAIF_LINK_HIGH_BANDW:
27                         pref = CFPHYPREF_HIGH_BW;
28                         break;
29                 case CAIF_LINK_LOW_LATENCY:
30                         pref = CFPHYPREF_LOW_LAT;
31                         break;
32                 default:
33                         return -EINVAL;
34                 }
35                 dev_info = cfcnfg_get_phyid(cnfg, pref);
36                 if (dev_info == NULL)
37                         return -ENODEV;
38                 l->phyid = dev_info->id;
39         }
40         switch (s->protocol) {
41         case CAIFPROTO_AT:
42                 l->linktype = CFCTRL_SRV_VEI;
43                 if (s->sockaddr.u.at.type == CAIF_ATTYPE_PLAIN)
44                         l->chtype = 0x02;
45                 else
46                         l->chtype = s->sockaddr.u.at.type;
47                 l->endpoint = 0x00;
48                 break;
49         case CAIFPROTO_DATAGRAM:
50                 l->linktype = CFCTRL_SRV_DATAGRAM;
51                 l->chtype = 0x00;
52                 l->u.datagram.connid = s->sockaddr.u.dgm.connection_id;
53                 break;
54         case CAIFPROTO_DATAGRAM_LOOP:
55                 l->linktype = CFCTRL_SRV_DATAGRAM;
56                 l->chtype = 0x03;
57                 l->endpoint = 0x00;
58                 l->u.datagram.connid = s->sockaddr.u.dgm.connection_id;
59                 break;
60         case CAIFPROTO_RFM:
61                 l->linktype = CFCTRL_SRV_RFM;
62                 l->u.datagram.connid = s->sockaddr.u.rfm.connection_id;
63                 strncpy(l->u.rfm.volume, s->sockaddr.u.rfm.volume,
64                         sizeof(l->u.rfm.volume)-1);
65                 l->u.rfm.volume[sizeof(l->u.rfm.volume)-1] = 0;
66                 break;
67         case CAIFPROTO_UTIL:
68                 l->linktype = CFCTRL_SRV_UTIL;
69                 l->endpoint = 0x00;
70                 l->chtype = 0x00;
71                 strncpy(l->u.utility.name, s->sockaddr.u.util.service,
72                         sizeof(l->u.utility.name)-1);
73                 l->u.utility.name[sizeof(l->u.utility.name)-1] = 0;
74                 caif_assert(sizeof(l->u.utility.name) > 10);
75                 l->u.utility.paramlen = s->param.size;
76                 if (l->u.utility.paramlen > sizeof(l->u.utility.params))
77                         l->u.utility.paramlen = sizeof(l->u.utility.params);
78
79                 memcpy(l->u.utility.params, s->param.data,
80                        l->u.utility.paramlen);
81
82                 break;
83         case CAIFPROTO_DEBUG:
84                 l->linktype = CFCTRL_SRV_DBG;
85                 l->endpoint = s->sockaddr.u.dbg.service;
86                 l->chtype = s->sockaddr.u.dbg.type;
87                 break;
88         default:
89                 return -EINVAL;
90         }
91         return 0;
92 }