OpENer - Open Source EtherNet/IP(TM) I/O Target Stack  2.1
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
cipqos.c
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright (c) 2009/, Rockwell Automation, Inc.
3  * All rights reserved.
4  *
5  ******************************************************************************/
6 
7 #include "cipqos.h"
8 
9 #include "opener_user_conf.h"
10 #include "cipcommon.h"
11 #include "cipmessagerouter.h"
12 #include "ciperror.h"
13 #include "endianconv.h"
14 #include "cipethernetlink.h"
15 #include "opener_api.h"
16 #include "trace.h"
17 
28 /************** Functions ****************************************/
30  CipInstance *const RESTRICT instance,
31  CipMessageRouterRequest *RESTRICT const message_router_request,
32  CipMessageRouterResponse *RESTRICT const message_router_response,
33  struct sockaddr *originator_address,
34  const int encapsulation_session) {
35 
36  return GetAttributeSingle(instance, message_router_request,
37  message_router_response, originator_address,
38  encapsulation_session);
39 }
40 
42  CipInstance *instance,
43  CipMessageRouterRequest *message_router_request,
44  CipMessageRouterResponse *message_router_response,
45  struct sockaddr *originator_address,
46  const int encapsulation_session) {
47 
49  instance, message_router_request->request_path.attribute_number);
50  (void) instance; /*Suppress compiler warning */
51  EipUint16 attribute_number =
52  message_router_request->request_path.attribute_number;
53  uint8_t set_bit_mask = (instance->cip_class->set_bit_mask[CalculateIndex(
54  attribute_number)
55  ]);
56 
57  if( NULL != attribute &&
58  ( set_bit_mask & ( 1 << ( (attribute_number) % 8 ) ) ) ) {
59  CipUint attribute_value_recieved = GetDintFromMessage(
60  &(message_router_request->data) );
61 
62  if( !( (attribute_value_recieved <= 0) ||
63  (attribute_value_recieved >= 63) ) ) {
64  OPENER_TRACE_INFO(" setAttribute %d\n", attribute_number);
65 
66  if(NULL != attribute->data) {
67  CipUsint *data = (CipUsint *) attribute->data;
68  *(data) = attribute_value_recieved;
69 
70  message_router_response->general_status = kCipErrorSuccess;
71  } else {
72  message_router_response->general_status = kCipErrorNotEnoughData;
73  OPENER_TRACE_INFO("CIP QoS not enough data\n");
74  }
75  } else {
76  message_router_response->general_status = kCipErrorInvalidAttributeValue;
77  }
78  } else {
79  /* we don't have this attribute */
80  message_router_response->general_status = kCipErrorAttributeNotSupported;
81  }
82 
83  message_router_response->size_of_additional_status = 0;
84  message_router_response->data_length = 0;
85  message_router_response->reply_service = (0x80
86  | message_router_request->service);
87 
88  return kEipStatusOkSend;
89 }
90 
92 
93  CipUsint priority_value = dscp_explicit;
94  switch (priority) {
96  priority_value = dscp_low;
97  break;
99  priority_value = dscp_high;
100  break;
102  priority_value = dscp_scheduled;
103  break;
105  priority_value = dscp_urgent;
106  break;
107  default:
108  priority_value = dscp_explicit;
109  break;
110  }
111  return priority_value;
112 }
113 
115  CipClass *meta_class = class->class_instance.cip_class;
116 }
117 
119 
120  CipClass *qos_class = NULL;
121 
122  if( ( qos_class = CreateCipClass(kCipQoSClassCode,
123  0, /* # class attributes*/
124  7, /* # highest class attribute number*/
125  0, /* # class services*/
126  8, /* # instance attributes*/
127  8, /* # highest instance attribute number*/
128  2, /* # instance services*/
129  1, /* # instances*/
130  "Quality of Service",
131  1, /* # class revision*/
132  &InitializeCipQos /* # function pointer for initialization*/
133  ) ) == 0 ) {
134 
135  return kEipStatusError;
136  }
137 
138  CipInstance *instance = GetCipInstance(qos_class, 1); /* bind attributes to the instance #1 that was created above*/
139 
140  InsertAttribute(instance, 1, kCipUsint, (void *) &q_frames_enable,
142  InsertAttribute(instance, 2, kCipUsint, (void *) &dscp_event,
144  InsertAttribute(instance, 3, kCipUsint, (void *) &dscp_general,
146  InsertAttribute(instance, 4, kCipUsint, (void *) &dscp_urgent,
148  InsertAttribute(instance, 5, kCipUsint, (void *) &dscp_scheduled,
150  InsertAttribute(instance, 6, kCipUsint, (void *) &dscp_high,
152  InsertAttribute(instance, 7, kCipUsint, (void *) &dscp_low,
154  InsertAttribute(instance, 8, kCipUsint, (void *) &dscp_explicit,
156 
158  "GetAttributeSingleQoS");
160  "SetAttributeSingleQoS");
161 
162  return kEipStatusOk;
163 }
void InsertAttribute(CipInstance *const instance, const EipUint16 attribute_number, const EipUint8 cip_type, void *const data, const EipByte cip_flags)
Insert an attribute in an instance of a CIP class.
Definition: cipcommon.c:304
const CipOctet * data
Definition: ciptypes.h:191
Tracing infrastructure for OpENer.
CIP Message Router Request.
Definition: ciptypes.h:187
CipUsint dscp_scheduled
Definition: cipqos.c:22
CipUsint dscp_low
Definition: cipqos.c:24
Class is a subclass of Instance.
Definition: ciptypes.h:237
CipUsint dscp_explicit
Definition: cipqos.c:25
EipUint32 GetDintFromMessage(const EipUint8 **const buffer)
Reads EIP_UINT32 from *buffer and converts little endian to host.
Definition: endianconv.c:83
Responsible for Endianess conversion.
size_t CalculateIndex(EipUint16 attribute_number)
Calculates Byte-Index of Attribute.
Definition: cipcommon.c:895
CipUsint q_frames_enable
Definition: cipqos.c:18
Public interface of the QoS Object.
CipClass * CreateCipClass(const EipUint32 class_id, const int number_of_class_attributes, const EipUint32 highest_class_attribute_number, const int number_of_class_services, const int number_of_instance_attributes, const EipUint32 highest_instance_attribute_number, const int number_of_instance_services, const int number_of_instances, char *name, const EipUint16 revision, void(*InitializeCipClass)(CipClass *))
Definition: cipcommon.c:189
EipStatus
EIP stack status enum.
Definition: typedefs.h:93
CipUsint dscp_high
Definition: cipqos.c:23
void InsertService(const CipClass *const class, const EipUint8 service_number, const CipServiceFunction service_function, char *const service_name)
Insert a service in an instance of a CIP object.
Definition: cipcommon.c:346
CipInstance class_instance
Definition: ciptypes.h:238
CipUsint dscp_urgent
Definition: cipqos.c:21
#define OPENER_TRACE_INFO(...)
Definition: trace.h:89
EipStatus GetAttributeSingle(CipInstance *RESTRICT const instance, CipMessageRouterRequest *const message_router_request, CipMessageRouterResponse *const message_router_response, struct sockaddr *originator_address, const int encapsulation_session)
Generic implementation of the GetAttributeSingle CIP service.
Definition: cipcommon.c:391
uint8_t CipUsint
Definition: typedefs.h:46
CipInstance * GetCipInstance(const CipClass *RESTRICT const cip_class, EipUint32 instance_number)
Get a pointer to an instance.
CipUsint dscp_event
Definition: cipqos.c:19
CipUsint GetPriorityForSocket(ConnectionObjectPriority priority)
Initializing the data structures of the TCP/IP interface object.
Definition: cipqos.c:91
CipUsint dscp_general
Definition: cipqos.c:20
CipAttributeStruct * GetCipAttribute(const CipInstance *const instance, const EipUint16 attribute_number)
Get a pointer to an instance's attribute.
Definition: cipcommon.c:373
EipUint16 attribute_number
Definition: ciptypes.h:156
EipStatus CipQoSInit()
Definition: cipqos.c:118
ConnectionObjectPriority
uint16_t CipUint
Definition: typedefs.h:47
uint8_t * set_bit_mask
Definition: ciptypes.h:249
CIP Message Router Response.
Definition: ciptypes.h:199
struct cip_class * cip_class
Definition: ciptypes.h:231
EipStatus GetAttributeSingleQoS(CipInstance *const RESTRICT instance, CipMessageRouterRequest *RESTRICT const message_router_request, CipMessageRouterResponse *RESTRICT const message_router_response, struct sockaddr *originator_address, const int encapsulation_session)
Definition: cipqos.c:29
uint16_t EipUint16
Definition: typedefs.h:33
void InitializeCipQos(CipClass *class)
Definition: cipqos.c:114
CipUsint size_of_additional_status
Definition: ciptypes.h:205
EipStatus SetAttributeSingleQoS(CipInstance *instance, CipMessageRouterRequest *message_router_request, CipMessageRouterResponse *message_router_response, struct sockaddr *originator_address, const int encapsulation_session)
Definition: cipqos.c:41