Kaynağa Gözat

IP4.h: add mask-combining constructor

Add an IP4 constructor that combines a net and host portion per
specific mask.
H. Peter Anvin 1 yıl önce
ebeveyn
işleme
d3498f3a80

+ 10 - 2
esp32/max80/IP4.h

@@ -16,6 +16,9 @@ private:
 	uint8_t b[4];
 	uint32_t l;
     };
+    static constexpr uint32_t hostmask(unsigned int n) {
+	return n >= 32 ? 0 : ((uint32_t)1 << n)-1;
+    }
 public:
     constexpr IP4() : l{0} { }
     constexpr IP4(nullptr_t) : l{0} { }
@@ -28,6 +31,10 @@ public:
 	l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
     constexpr IP4(const esp_ip_addr_t & ip) :
 	l{ip.type == IPADDR_TYPE_V4 ? ip.u_addr.ip4.addr : 0} { }
+    constexpr IP4(IP4 nip, IP4 hip, unsigned int n) :
+	l{(nip.l & ~hostmask(n)) | (hip.l & hostmask(n))} { }
+    constexpr IP4(IP4 nip, IP4 hip, IP4 mask) :
+	l{(nip.l & ~mask.l) | (hip.l & mask.l)} { }
     IP4(const char *str);
 
     operator uint32_t () const { return l; }
@@ -53,11 +60,12 @@ public:
     constexpr IP4 operator ^ (const IP4 &b) const { return IP4(l ^ b.l); }
     constexpr IP4 operator ~ () const { return IP4(~l); }
     constexpr IP4 operator / (unsigned int n) const {
-	return IP4(n >= 32 ? l : l & ~(((uint32_t)1 << n)-1));
+	return IP4(l & ~hostmask(n));
     }
     constexpr IP4 operator % (unsigned int n) const {
-	return IP4(n >= 32 ? 0 : l & (((uint32_t)1 << n)-1));
+	return IP4(l & hostmask(n));
     }
+
     constexpr uint8_t operator [] (size_t n) const { return b[n]; }
     uint8_t & operator [] (size_t n) { return b[n]; }
 

BIN
esp32/output/max80.ino.bin


BIN
fpga/output/max80.fw


BIN
fpga/output/v1.fw


BIN
fpga/output/v2.fw