• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/linux/linux-2.6.36/net/caif/
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