blob: 7d6311d3c314338cf480e3300f13c7b9cf9b80bf [file] [log] [blame]
Harald Welteac359802017-04-12 12:13:44 +02001/******************************************************************************
2* Copyright (c) 2005, 2014 Ericsson AB
3* All rights reserved. This program and the accompanying materials
4* are made available under the terms of the Eclipse Public License v1.0
5* which accompanies this distribution, and is available at
6* http://www.eclipse.org/legal/epl-v10.html
7*
8* Contributors:
9* Peter Dimitrov- initial implementation and initial documentation
10* Adam Delic
11* Eduard Czimbalmos
12* Endre Kulcsar
13* Gabor Bettesch
14* Gabor Szalai
15* Tamas Buti
16* Zoltan Medve
17******************************************************************************/
18//
19// File: SCTPasp_PT.hh
20// Description: SCTPasp test port header
21// Rev: R11A
22// Prodnr: CNL 113 469
23//
24
25
26#ifndef SCTPasp__PT_HH
27#define SCTPasp__PT_HH
28
29#include <TTCN3.hh>
30#include "SCTPasp_Types.hh"
31#include <sys/socket.h>
32#include <netinet/in.h>
33#include <netinet/sctp.h>
34
35namespace SCTPasp__Types {
36 class ASP__SCTP;
37 class ASP__SCTP__Connect;
38 class ASP__SCTP__ConnectFrom;
39 class ASP__SCTP__Listen;
40
41 class SCTP__INIT;
42 class SCTP__EVENTS;
43 class SO__LINGER;
44 class SCTP__RTOINFO;
45 class SAC__STATE;
46 class SPC__STATE;
47
48 class ASP__SCTP__SetSocketOptions;
49 class ASP__SCTP__Close;
50 class ASP__SCTP__ASSOC__CHANGE;
51 class ASP__SCTP__PEER__ADDR__CHANGE;
52 class ASP__SCTP__SEND__FAILED;
53 class ASP__SCTP__REMOTE__ERROR;
54 class ASP__SCTP__SHUTDOWN__EVENT;
55 class ASP__SCTP__PARTIAL__DELIVERY__EVENT;
56 class ASP__SCTP__ADAPTION__INDICATION;
57 class ASP__SCTP__Connected;
58 class ASP__SCTP__SENDMSG__ERROR;
59 class ASP__SCTP__RESULT;
60}
61
62namespace SCTPasp__PortType {
63class SCTPasp__PT_PROVIDER : public PORT {
64public:
65 SCTPasp__PT_PROVIDER(const char *par_port_name = NULL);
66 ~SCTPasp__PT_PROVIDER();
67
68 void set_parameter(const char *parameter_name,
69 const char *parameter_value);
70
71 void Event_Handler(const fd_set *read_fds,
72 const fd_set *write_fds, const fd_set *error_fds,
73 double time_since_last_call);
74
75protected:
76 void user_map(const char *system_port);
77 void user_unmap(const char *system_port);
78
79 void user_start();
80 void user_stop();
81
82 void outgoing_send(const SCTPasp__Types::ASP__SCTP__Connect& send_par);
83 void outgoing_send(const SCTPasp__Types::ASP__SCTP__ConnectFrom& send_par);
84 void outgoing_send(const SCTPasp__Types::ASP__SCTP__Listen& send_par);
85 void outgoing_send(const SCTPasp__Types::ASP__SCTP__SetSocketOptions& send_par);
86 void outgoing_send(const SCTPasp__Types::ASP__SCTP__Close& send_par);
87 void outgoing_send(const SCTPasp__Types::ASP__SCTP& send_par);
88
89 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP& incoming_par) = 0;
90 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__ASSOC__CHANGE& incoming_par) = 0;
91 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__PEER__ADDR__CHANGE& incoming_par) = 0;
92 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SEND__FAILED& incoming_par) = 0;
93 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__REMOTE__ERROR& incoming_par) = 0;
94 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SHUTDOWN__EVENT& incoming_par) = 0;
95 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__PARTIAL__DELIVERY__EVENT& incoming_par) = 0;
96 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__ADAPTION__INDICATION& incoming_par) = 0;
97 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__Connected& incoming_par) = 0;
98 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__SENDMSG__ERROR& incoming_par) = 0;
99 virtual void incoming_message(const SCTPasp__Types::ASP__SCTP__RESULT& incoming_par) = 0;
100
101private:
102 enum return_value_t { WHOLE_MESSAGE_RECEIVED, PARTIAL_RECEIVE, EOF_OR_ERROR };
103 return_value_t getmsg(int fd, struct msghdr *msg);
104 void handle_event(void *buf);
105 void log(const char *fmt, ...);
106 void error(const char *fmt, ...);
107 void handle_event_reconnect(void *buf);
108 void forced_reconnect(int attempts);
109 // map operations
110 void map_put_item(int fd);
111 int map_get_item(int fd);
112 void map_delete_item_fd(int fd);
113 void map_delete_item(int index);
114
115 void map_put_item_server(int fd, struct in_addr local_IP_address, unsigned short local_port);
116 int map_get_item_server(int fd);
117 void map_delete_item_fd_server(int fd);
118 void map_delete_item_server(int index);
119
120 void create_socket();
121 in_addr get_in_addr(const char *hostname);
122 void setNonBlocking(int fd);
123
124 boolean simple_mode;
125 boolean reconnect;
126 int reconnect_max_attempts;
127 boolean server_mode;
128 boolean debug;
129 int server_backlog;
130 struct in_addr local_IP_address;
131 struct in_addr peer_IP_address;
132 unsigned short local_port;
133 unsigned short peer_port;
134
135 struct sctp_event_subscribe events;
136 struct sctp_initmsg initmsg;
137
138 boolean local_port_is_present;
139 boolean peer_IP_address_is_present;
140 boolean peer_port_is_present;
141
142 int fd;
143 fd_set readfds, writefds;
144 int receiving_fd;
145
146 struct fd_map_item;
147 fd_map_item *fd_map;
148 int list_len;
149
150 struct fd_map_server_item;
151 fd_map_server_item *fd_map_server;
152 int list_len_server;
153
154
155};
156}
157#endif