caif_config_util.c 2.4 KB

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