[exim-cvs] DSCP: document; hex print; -bI:dscp

Kezdőlap
Üzenet törlése
Válasz az üzenetre
Szerző: Exim Git Commits Mailing List
Dátum:  
Címzett: exim-cvs
Tárgy: [exim-cvs] DSCP: document; hex print; -bI:dscp
Gitweb: http://git.exim.org/exim.git/commitdiff/36a3ae5f08725242b1fb4dfecc5617cc9c3e971b
Commit:     36a3ae5f08725242b1fb4dfecc5617cc9c3e971b
Parent:     9e4f596276eaa20045bdeb4bee2bf31438bfa0d3
Author:     Phil Pennock <pdp@???>
AuthorDate: Sat Jun 2 09:10:44 2012 -0400
Committer:  Phil Pennock <pdp@???>
CommitDate: Sat Jun 2 09:10:44 2012 -0400


    DSCP: document; hex print; -bI:dscp
---
 doc/doc-docbook/spec.xfpt   |   23 ++++++++++++++++++++++
 doc/doc-txt/ChangeLog       |    2 +
 doc/doc-txt/NewStuff        |    5 ++++
 doc/doc-txt/OptionLists.txt |    1 +
 src/src/exim.c              |   12 +++++++++-
 src/src/functions.h         |    1 +
 src/src/ip.c                |   44 +++++++++++++++++++++++++-----------------
 src/src/smtp_out.c          |    2 +-
 8 files changed, 69 insertions(+), 21 deletions(-)


diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 64aac1a..15a8f35 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -2938,6 +2938,7 @@ if this is required. If the &%bi_command%& option is not set, calling Exim with
&%-bi%& is a no-op.

.new
+. // Keep :help first, then the rest in alphabetical order
.vitem &%-bI:help%&
.oindex "&%-bI:help%&"
.cindex "querying exim information"
@@ -2947,6 +2948,12 @@ consumption. This one is not. The &%-bI:help%& option asks Exim for a
synopsis of supported options beginning &`-bI:`&. Use of any of these
options shall cause Exim to exit after producing the requested output.

+.vitem &%-bI:dscp%&
+.oindex "&%-bI:dscp%&"
+.cindex "DSCP" "values"
+This option causes Exim to emit an alphabetically sorted list of all
+recognised DSCP names.
+
.vitem &%-bI:sieve%&
.oindex "&%-bI:sieve%&"
.cindex "Sieve filter" "capabilities"
@@ -22094,6 +22101,22 @@ See the &%search_parents%& option in chapter &<<CHAPdnslookup>>& for more
details.


+.new
+.option dscp smtp string unset
+.cindex "DCSP"
+.cindex "DiffServ"
+This option causes the DSCP value associated with a socket to be set to one
+of a number of fixed strings. The &%-bI:dscp%& option may be used to ask
+Exim which values it knows of. Common values include &`throughput`&,
+&`mincost`&, and on newer systems &`ef`&, &`af41`&, ...
+
+The outbound packets from Exim will be marked with this value in the header
+(for IPv4, the TOS field; for IPv6, the TCLASS field); there is no guarantee
+that these packets will have any effect, not be stripped by networking
+equipment, or do much of anything without cooperation with your Network
+Engineer and those of all network operators between the source and destination.
+.wen
+

 .option fallback_hosts smtp "string list" unset
 .cindex "fallback" "hosts specified on transport"
diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog
index 34f9405..1e8063b 100644
--- a/doc/doc-txt/ChangeLog
+++ b/doc/doc-txt/ChangeLog
@@ -16,6 +16,8 @@ PP/04 First step towards DNSSEC, provide $sender_host_dnssec for
       $sender_host_name and config options to manage this, and basic check
       routines.


+PP/05 DSCP support for outbound connections.
+

Exim version 4.80
-----------------
diff --git a/doc/doc-txt/NewStuff b/doc/doc-txt/NewStuff
index 093feee..2aaf562 100644
--- a/doc/doc-txt/NewStuff
+++ b/doc/doc-txt/NewStuff
@@ -39,6 +39,11 @@ Version 4.81

     Current status: work-in-progress; $sender_host_dnssec variable added.


+ 5. DSCP support for outbound connections: on a transport using the smtp driver,
+    set "dscp = ef", for instance, to cause the connections to have the relevant
+    DSCP (IPv4 TOS or IPv6 TCLASS) value in the header.  Supported values depend
+    upon system libraries.  "exim -bI:dscp" to list the ones Exim knows of.
+


 Version 4.80
 ------------
diff --git a/doc/doc-txt/OptionLists.txt b/doc/doc-txt/OptionLists.txt
index 20d8dbd..1c7881e 100644
--- a/doc/doc-txt/OptionLists.txt
+++ b/doc/doc-txt/OptionLists.txt
@@ -187,6 +187,7 @@ driver                               string          unset         authenticator
                                                      unset         routers           4.00
                                                      unset         transports
 drop_cr                              boolean         false         main              4.00 became a no-op in 4.21
+dscp                                 string          unset         smtp              4.81
 dsn_from                             string*         +             main              4.67
 envelope_to_add                      boolean         false         transports
 envelope_to_remove                   boolean         true          main
diff --git a/src/src/exim.c b/src/src/exim.c
index 9f6f3d8..d20f938 100644
--- a/src/src/exim.c
+++ b/src/src/exim.c
@@ -57,7 +57,7 @@ store_free(block);
 *************************************************/


enum commandline_info { CMDINFO_NONE=0,
- CMDINFO_HELP, CMDINFO_SIEVE };
+ CMDINFO_HELP, CMDINFO_SIEVE, CMDINFO_DSCP };



@@ -1044,6 +1044,7 @@ switch(request)
 "If the string is not recognised, you'll get this help (on stderr).\n"
 "\n"
 "  exim -bI:help    this information\n"
+"  exim -bI:dscp    dscp value keywords known\n"
 "  exim -bI:sieve   list of supported sieve extensions, one per line.\n"
 );
     return;
@@ -1051,7 +1052,9 @@ switch(request)
     for (pp = exim_sieve_extension_list; *pp; ++pp)
       fprintf(stream, "%s\n", *pp);
     return;
-
+  case CMDINFO_DSCP:
+    dscp_list_to_stream(stream);
+    return;
   }
 }


@@ -1987,6 +1990,11 @@ for (i = 1; i < argc; i++)
           info_flag = CMDINFO_SIEVE;
           info_stdout = TRUE;
           }
+        else if (strcmpic(p, CUS"dscp") == 0)
+          {
+          info_flag = CMDINFO_DSCP;
+          info_stdout = TRUE;
+          }
         else if (strcmpic(p, CUS"help") == 0)
           {
           info_stdout = TRUE;
diff --git a/src/src/functions.h b/src/src/functions.h
index dd9549b..7fea6ff 100644
--- a/src/src/functions.h
+++ b/src/src/functions.h
@@ -109,6 +109,7 @@ extern int     dns_lookup(dns_answer *, uschar *, int, uschar **);
 extern int     dns_special_lookup(dns_answer *, uschar *, int, uschar **);
 extern dns_record *dns_next_rr(dns_answer *, dns_scan *, int);
 extern uschar *dns_text_type(int);
+extern void    dscp_list_to_stream(FILE *);
 extern BOOL    dscp_lookup(const uschar *, int, int *, int *, int *);


 extern void    enq_end(uschar *);
diff --git a/src/src/ip.c b/src/src/ip.c
index 66a750d..be4511d 100644
--- a/src/src/ip.c
+++ b/src/src/ip.c
@@ -372,29 +372,29 @@ struct dscp_name_tableentry {
 /* Keep both of these tables sorted! */
 static struct dscp_name_tableentry dscp_table[] = {
 #ifdef IPTOS_DSCP_AF11
-    { "af11", IPTOS_DSCP_AF11 },
-    { "af12", IPTOS_DSCP_AF12 },
-    { "af13", IPTOS_DSCP_AF13 },
-    { "af21", IPTOS_DSCP_AF21 },
-    { "af22", IPTOS_DSCP_AF22 },
-    { "af23", IPTOS_DSCP_AF23 },
-    { "af31", IPTOS_DSCP_AF31 },
-    { "af32", IPTOS_DSCP_AF32 },
-    { "af33", IPTOS_DSCP_AF33 },
-    { "af41", IPTOS_DSCP_AF41 },
-    { "af42", IPTOS_DSCP_AF42 },
-    { "af43", IPTOS_DSCP_AF43 },
-    { "ef", IPTOS_DSCP_EF },
+    { CUS"af11", IPTOS_DSCP_AF11 },
+    { CUS"af12", IPTOS_DSCP_AF12 },
+    { CUS"af13", IPTOS_DSCP_AF13 },
+    { CUS"af21", IPTOS_DSCP_AF21 },
+    { CUS"af22", IPTOS_DSCP_AF22 },
+    { CUS"af23", IPTOS_DSCP_AF23 },
+    { CUS"af31", IPTOS_DSCP_AF31 },
+    { CUS"af32", IPTOS_DSCP_AF32 },
+    { CUS"af33", IPTOS_DSCP_AF33 },
+    { CUS"af41", IPTOS_DSCP_AF41 },
+    { CUS"af42", IPTOS_DSCP_AF42 },
+    { CUS"af43", IPTOS_DSCP_AF43 },
+    { CUS"ef", IPTOS_DSCP_EF },
 #endif
 #ifdef IPTOS_LOWCOST
-    { "lowcost", IPTOS_LOWCOST },
+    { CUS"lowcost", IPTOS_LOWCOST },
 #endif
-    { "lowdelay", IPTOS_LOWDELAY },
+    { CUS"lowdelay", IPTOS_LOWDELAY },
 #ifdef IPTOS_MINCOST
-    { "mincost", IPTOS_MINCOST },
+    { CUS"mincost", IPTOS_MINCOST },
 #endif
-    { "reliability", IPTOS_RELIABILITY },
-    { "throughput", IPTOS_THROUGHPUT }
+    { CUS"reliability", IPTOS_RELIABILITY },
+    { CUS"throughput", IPTOS_THROUGHPUT }
 };
 static int dscp_table_size =
   sizeof(dscp_table) / sizeof(struct dscp_name_tableentry);
@@ -468,5 +468,13 @@ while (last > first)
 return FALSE;
 }


+void
+dscp_list_to_stream(FILE *stream)
+{
+int i;
+for (i=0; i < dscp_table_size; ++i)
+ fprintf(stream, "%s\n", dscp_table[i].name);
+}
+

 /* End of ip.c */
diff --git a/src/src/smtp_out.c b/src/src/smtp_out.c
index 7b58b4a..42a889a 100644
--- a/src/src/smtp_out.c
+++ b/src/src/smtp_out.c
@@ -212,7 +212,7 @@ bomb out, just log it and continue in default traffic class. */
 if (dscp && dscp_lookup(dscp, host_af, &dscp_level, &dscp_option, &dscp_value))
   {
   HDEBUG(D_transport|D_acl|D_v)
-    debug_printf("DSCP \"%s\"=%d ", dscp, dscp_value);
+    debug_printf("DSCP \"%s\"=%x ", dscp, dscp_value);
   if (setsockopt(sock, dscp_level, dscp_option, &dscp_value, sizeof(dscp_value)) < 0)
     HDEBUG(D_transport|D_acl|D_v)
       debug_printf("failed to set DSCP: %s ", strerror(errno));