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 13int 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} 93