]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Add local ComboAddress parameter for SBind() at TeeAction()
authorFredericDT <frederic.dt.twh@gmail.com>
Tue, 30 Aug 2022 12:34:35 +0000 (20:34 +0800)
committerFredericDT <frederic.dt.twh@gmail.com>
Wed, 31 Aug 2022 01:49:32 +0000 (09:49 +0800)
Uasge:
    `addAction(AllRule(), TeeAction("192.0.2.54", false, "192.0.2.53"))`

    In which case, "192.0.2.54" is the ComboAddress of receiver, "192.0.2.53"
    is the ComboAddress of sender.

Signed-off-by: FredericDT <frederic.dt.twh@gmail.com>
pdns/dnsdist-lua-actions.cc

index cc1ec21d27397b8da93c4fc2464573205ada8c90..ea9ccbc0a42418d20f1a8d6d6c4b76afb218d343 100644 (file)
@@ -127,7 +127,7 @@ class TeeAction : public DNSAction
 {
 public:
   // this action does not stop the processing
-  TeeAction(const ComboAddress& ca, bool addECS=false);
+  TeeAction(const ComboAddress& rca, const ComboAddress& lca, bool setLocalBindAddress=false, bool addECS=false);
   ~TeeAction() override;
   DNSAction::Action operator()(DNSQuestion* dq, std::string* ruleresult) const override;
   std::string toString() const override;
@@ -135,6 +135,7 @@ public:
 
 private:
   ComboAddress d_remote;
+  ComboAddress d_local;
   std::thread d_worker;
   void worker();
 
@@ -152,13 +153,18 @@ private:
   mutable stat_t d_tcpdrops{0};
   stat_t d_otherrcode{0};
   std::atomic<bool> d_pleaseQuit{false};
+  bool d_setLocalBindAddress{false};
   bool d_addECS{false};
 };
 
-TeeAction::TeeAction(const ComboAddress& ca, bool addECS) : d_remote(ca), d_addECS(addECS)
+TeeAction::TeeAction(const ComboAddress& rca, const ComboAddress& lca, bool setLocalBindAddress, bool addECS) 
+  : d_remote(rca), d_local(lca), d_setLocalBindAddress(setLocalBindAddress), d_addECS(addECS)
 {
   d_fd=SSocket(d_remote.sin4.sin_family, SOCK_DGRAM, 0);
   try {
+    if (d_setLocalBindAddress) {
+      SBind(d_fd, d_local);
+    }
     SConnect(d_fd, d_remote);
     setNonBlocking(d_fd);
     d_worker=std::thread([this](){worker();});
@@ -2416,8 +2422,8 @@ void setupLuaActions(LuaContext& luaCtx)
     });
 #endif /* DISABLE_PROTOBUF */
 
-  luaCtx.writeFunction("TeeAction", [](const std::string& remote, boost::optional<bool> addECS) {
-      return std::shared_ptr<DNSAction>(new TeeAction(ComboAddress(remote, 53), addECS ? *addECS : false));
+  luaCtx.writeFunction("TeeAction", [](const std::string& remote, boost::optional<bool> addECS, boost::optional<std::string> local) {
+      return std::shared_ptr<DNSAction>(new TeeAction(ComboAddress(remote, 53), ComboAddress(local ? *local : "0.0.0.0", 0), local ? true : false, addECS ? *addECS : false));
     });
 
   luaCtx.writeFunction("SetECSPrefixLengthAction", [](uint16_t v4PrefixLength, uint16_t v6PrefixLength) {