1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
#ifndef _SCACHE_H_INCLUDED_
#define _SCACHE_H_INCLUDED_
/*++
/* NAME
/* scache 3h
/* SUMMARY
/* generic session cache API
/* SYNOPSIS
/* #include <scache.h>
/* DESCRIPTION
/* .nf
/*
* Utility library.
*/
#include <vstring.h>
typedef struct SCACHE SCACHE;
typedef struct SCACHE_SIZE SCACHE_SIZE;
/*
* In order to cache a session, we specify:
*
* - TTL for this session.
*
* - File descriptor.
*
* - Transport name and physical endpoint. The transport name must be included,
* because fall-back destinations can be transport-dependent, and routing
* for a given destination may be context dependent.
*
* In the case of SMTP, the physical endpoint is the numerical IP address and
* TCP port.
*
* - Application-specific endpoint properties.
*
* In the case of SMTP, the properties specify the ESMTP features advertised by
* the server.
*
* Note: with message delivery transports that have only one endpoint per
* logical destination, the above is the only information that needs to be
* maintained in a connection cache.
*/
typedef void (*SCACHE_SAVE_ENDP_FN) (SCACHE *, int, const char *, const char *, int);
typedef int (*SCACHE_FIND_ENDP_FN) (SCACHE *, const char *, VSTRING *);
/*
* The following information is stored in order to make a binding from
* logical destination to physical destination. One logical destination can
* have multiple physical destinations (and one physical destination can
* have multiple sessions).
*
* - TTL for this binding.
*
* - Transport name and logical destination.
*
* In the case of SMTP: the next-hop (NOT: fall-back) destination domain and
* destination network port. It is not useful to create a link for an
* address literal (but it is not harmful either: it just wastes a few
* bits). This information specifies the destination domain in [] if no MX
* lookup is done.
*
* - Application-specific properties.
*
* In case the of SMTP, the properties specify a) whether a physical endpoint
* is best mx host with respect to a logical or fall-back destination (this
* information is needed by the loop detection code in smtp_proto.c).
*
* - Transport name and physical endpoint (see above).
*
* Note 1: there is no need to store the binding's MX preference or equivalent
* with respect to the logical destination; a client should store only the
* first successful session for a given delivery request (otherwise the
* client would keep talking to a less preferred server after the cached
* connection for a more preferred server expires). After a failed delivery,
* the client should not attempt to cache follow-up sessions with less
* preferred endpoints under the same logical destination.
*
* Note 2: logical to physical bindings exist independently from cached
* sessions. The two types of information have independent TTLs; creation
* and destruction proceed independently. Thus, a logical to physical
* binding can refer to an endpoint for which all cached connections are
* occupied or expired.
*/
typedef void (*SCACHE_SAVE_DEST_FN) (SCACHE *, int, const char *, const char *, const char *);
typedef int (*SCACHE_FIND_DEST_FN) (SCACHE *, const char *, VSTRING *, VSTRING *);
/*
* Session cache statistics. These are the actual numbers at a specific
* point in time.
*/
struct SCACHE_SIZE {
int dest_count; /* Nr of destination names */
int endp_count; /* Nr of endpoint addresses */
int sess_count; /* Nr of cached sessions */
};
/*
* Generic session cache object. Actual session cache objects are derived
* types with some additional, cache dependent, private information.
*/
struct SCACHE {
SCACHE_SAVE_ENDP_FN save_endp;
SCACHE_FIND_ENDP_FN find_endp;
SCACHE_SAVE_DEST_FN save_dest;
SCACHE_FIND_DEST_FN find_dest;
void (*size) (struct SCACHE *, SCACHE_SIZE *);
void (*free) (struct SCACHE *);
};
extern SCACHE *scache_single_create(void);
extern SCACHE *scache_clnt_create(const char *, int, int, int);
extern SCACHE *scache_multi_create(void);
#define scache_save_endp(scache, ttl, endp_label, endp_prop, fd) \
(scache)->save_endp((scache), (ttl), (endp_label), (endp_prop), (fd))
#define scache_find_endp(scache, endp_label, endp_prop) \
(scache)->find_endp((scache), (endp_label), (endp_prop))
#define scache_save_dest(scache, ttl, dest_label, dest_prop, endp_label) \
(scache)->save_dest((scache), (ttl), (dest_label), (dest_prop), (endp_label))
#define scache_find_dest(scache, dest_label, dest_prop, endp_prop) \
(scache)->find_dest((scache), (dest_label), (dest_prop), (endp_prop))
#define scache_size(scache, stats) (scache)->size((scache), (stats))
#define scache_free(scache) (scache)->free(scache)
/*
* Cache types.
*/
#define SCACHE_TYPE_SINGLE 1 /* single-instance cache */
#define SCACHE_TYPE_CLIENT 2 /* session cache client */
#define SCACHE_TYPE_MULTI 3 /* multi-instance cache */
/*
* Client-server protocol.
*/
#define SCACHE_REQ_FIND_ENDP "find_endp"
#define SCACHE_REQ_SAVE_ENDP "save_endp"
#define SCACHE_REQ_FIND_DEST "find_dest"
#define SCACHE_REQ_SAVE_DEST "save_dest"
/*
* Session cache server status codes.
*/
#define SCACHE_STAT_OK 0 /* request completed successfully */
#define SCACHE_STAT_BAD 1 /* malformed request */
#define SCACHE_STAT_FAIL 2 /* request completed unsuccessfully */
/* LICENSE
/* .ad
/* .fi
/* The Secure Mailer license must be distributed with this software.
/* AUTHOR(S)
/* Wietse Venema
/* IBM T.J. Watson Research
/* P.O. Box 704
/* Yorktown Heights, NY 10598, USA
/*
/* Wietse Venema
/* Google, Inc.
/* 111 8th Avenue
/* New York, NY 10011, USA
/*--*/
#endif
|