|
|
@@ -2764,6 +2764,7 @@
|
|
|
<tr>
|
|
|
<th class="py-2.5 px-3">Network (CIDR)</th>
|
|
|
<th class="py-2.5 px-3">Status</th>
|
|
|
+ <th class="py-2.5 px-3">Discard Route</th>
|
|
|
<th class="py-2.5 px-3">Comment</th>
|
|
|
<th class="py-2.5 px-3 text-right font-sans">Actions</th>
|
|
|
</tr>
|
|
|
@@ -9256,9 +9257,8 @@
|
|
|
<!-- Tab Navigation -->
|
|
|
<div class="flex border-b border-slate-800 bg-slate-950/30 px-6 gap-2">
|
|
|
<button type="button" id="bgp-peer-tab-btn-general" onclick="switchBgpPeerModalTab('general')" class="px-4 py-2 text-xs font-bold border-b-2 border-cyan-500 text-white transition">General</button>
|
|
|
- <button type="button" id="bgp-peer-tab-btn-extra" onclick="switchBgpPeerModalTab('extra')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Extra</button>
|
|
|
- <button type="button" id="bgp-peer-tab-btn-attributes" onclick="switchBgpPeerModalTab('attributes')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Attributes</button>
|
|
|
- <button type="button" id="bgp-peer-tab-btn-filter" onclick="switchBgpPeerModalTab('filter')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Filter</button>
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-filters" onclick="switchBgpPeerModalTab('filters')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Routing & Filters</button>
|
|
|
+ <button type="button" id="bgp-peer-tab-btn-networks" onclick="switchBgpPeerModalTab('networks')" class="px-4 py-2 text-xs font-bold border-b-2 border-transparent text-slate-400 hover:text-slate-200 transition">Advertised Networks</button>
|
|
|
</div>
|
|
|
|
|
|
<!-- Body Form -->
|
|
|
@@ -9279,81 +9279,32 @@
|
|
|
</div>
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Comment</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-comment" placeholder="Optional notes" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Name *</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-name" required placeholder="ebgp-JB172-2" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Instance</label>
|
|
|
- <div class="col-span-2 flex items-center gap-1.5">
|
|
|
- <input type="text" id="modal-bgp-peer-instance" placeholder="bgp-instance-1" class="flex-1 bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <button type="button" onclick="openBgpInstanceModal()" class="px-2 py-1 bg-slate-800 hover:bg-slate-700 border border-slate-700 rounded text-slate-300 font-mono text-xs">...</button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Template</label>
|
|
|
+ <label class="text-slate-400 font-medium">Connection Name *</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-template" placeholder="AWMN-ebgp (Optional)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <input type="text" id="modal-bgp-peer-name" required placeholder="e.g. Primcast, ebgp-JB172" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">AS (Local AS)</label>
|
|
|
+ <label class="text-slate-400 font-medium">Comment</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="number" id="modal-bgp-peer-local-as" min="1" max="4294967295" placeholder="e.g. 6610 (Multi-Instance Local AS)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Custom Local AS for this BGP session (Multi-Instance). Leave blank to use Global Router AS.</p>
|
|
|
+ <input type="text" id="modal-bgp-peer-comment" placeholder="Optional notes / description" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white">
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">AFI</label>
|
|
|
- <div class="col-span-2 flex items-center flex-wrap gap-3 text-slate-300">
|
|
|
- <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-afi-ip" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>ip</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-afi-ipv6" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>ipv6</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-afi-l2vpn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>l2vpn</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-afi-vpnv4" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>vpnv4</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-1.5 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-afi-l2vpn-cisco" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>l2vpn cisco</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <hr class="border-slate-800/80 my-2">
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Router ID</label>
|
|
|
+ <label class="text-slate-400 font-medium">Remote AS *</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-router-id" placeholder="e.g. 10.42.62.254 (Optional override)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <input type="number" id="modal-bgp-peer-remote-as" required min="1" max="4294967295" placeholder="e.g. 65555" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <hr class="border-slate-800/80 my-2">
|
|
|
-
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
<label class="text-slate-400 font-medium">Remote Address *</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-remote-addr" required placeholder="10.2.51.249" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <input type="text" id="modal-bgp-peer-remote-addr" required placeholder="e.g. 192.168.129.225" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
@@ -9364,194 +9315,61 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Remote AS *</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="number" id="modal-bgp-peer-remote-as" required min="1" max="4294967295" placeholder="17244" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Remote Allow AS</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-remote-allow-as" placeholder="e.g. 17244,65000 (Optional)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
<hr class="border-slate-800/80 my-2">
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Local Address</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-local-addr" placeholder="e.g. 10.2.51.250" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Local Port</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="number" id="modal-bgp-peer-local-port" placeholder="Optional bind port" min="1" max="65535" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Local Role</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <select id="modal-bgp-peer-local-role" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <option value="ebgp">ebgp</option>
|
|
|
- <option value="ibgp">ibgp</option>
|
|
|
- </select>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">TCP MD5 Key</label>
|
|
|
+ <label class="text-slate-400 font-medium">Local AS (Override)</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="password" id="modal-bgp-peer-password" placeholder="BGP authentication secret" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <input type="number" id="modal-bgp-peer-local-as" min="1" max="4294967295" placeholder="Leave blank to use Global Router AS" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Per-peer Local AS override. If blank, uses global BGP Instance AS.</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <hr class="border-slate-800/80 my-2">
|
|
|
-
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Multi-hop</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-multihop" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Enable eBGP Multi-hop</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">TTL Limits</label>
|
|
|
- <div class="col-span-2 grid grid-cols-2 gap-3">
|
|
|
- <div>
|
|
|
- <span class="text-[10px] text-slate-500 block mb-0.5">Tx TTL</span>
|
|
|
- <input type="number" id="modal-bgp-peer-tx-ttl" min="1" max="255" placeholder="64 (default)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
+ <label class="text-slate-400 font-medium">Local Address & Port</label>
|
|
|
+ <div class="col-span-2 grid grid-cols-3 gap-2">
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" id="modal-bgp-peer-local-addr" placeholder="Optional bind IP (e.g. 192.168.129.226)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
<div>
|
|
|
- <span class="text-[10px] text-slate-500 block mb-0.5">Rx Min TTL</span>
|
|
|
- <input type="number" id="modal-bgp-peer-rx-min-ttl" min="0" max="255" placeholder="0 (any)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
+ <input type="number" id="modal-bgp-peer-local-port" placeholder="Port" min="1" max="65535" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Session Mode</label>
|
|
|
- <div class="col-span-2 flex items-center gap-6 text-slate-300">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-connect" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Connect</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-listen" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Listen</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- TAB 2: EXTRA -->
|
|
|
- <div id="bgp-peer-tab-extra" class="space-y-3.5 hidden">
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Hold Time</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-holdtime" placeholder="00:00:30 (30s) or 00:03:00" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Keepalive Time</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-keepalive" placeholder="00:00:10 (10s) or 00:01:00" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Use BFD</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-use-bfd" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Enable Bidirectional Forwarding Detection (BFD)</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Routing Table</label>
|
|
|
+ <label class="text-slate-400 font-medium">Local Role</label>
|
|
|
<div class="col-span-2">
|
|
|
- <select id="modal-bgp-peer-routing-table" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <option value="main">main</option>
|
|
|
+ <select id="modal-bgp-peer-local-role" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <option value="ebgp">ebgp (External BGP - Default)</option>
|
|
|
+ <option value="ibgp">ibgp (Internal BGP)</option>
|
|
|
</select>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">VRF</label>
|
|
|
+ <label class="text-slate-400 font-medium">TCP MD5 Secret</label>
|
|
|
<div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-vrf" placeholder="main (default)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Client Reflection</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-no-client-reflect" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>No Client To Client Reflection</span>
|
|
|
- </label>
|
|
|
+ <input type="password" id="modal-bgp-peer-password" placeholder="BGP authentication password (optional)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
<hr class="border-slate-800/80 my-2">
|
|
|
|
|
|
<div class="grid grid-cols-3 items-start gap-3">
|
|
|
- <label class="text-slate-400 font-medium pt-1">Output Redistribute</label>
|
|
|
- <div class="col-span-2 grid grid-cols-3 gap-2 text-slate-300">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-conn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>connected</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-static" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>static</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-rip" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>rip</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-ospf" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>ospf</span>
|
|
|
- </label>
|
|
|
+ <label class="text-slate-400 font-medium pt-1">Session Flags</label>
|
|
|
+ <div class="col-span-2 space-y-2 text-slate-300">
|
|
|
<label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-bgp" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>bgp</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-vpn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>vpn</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-dhcp" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>dhcp</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-fantasy" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>fantasy</span>
|
|
|
- </label>
|
|
|
- <label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-modem" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>modem</span>
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-multihop" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>eBGP Multi-hop (allow peers across multiple routing hops)</span>
|
|
|
</label>
|
|
|
<label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-bgp-mpls-vpn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>bgp-mpls-vpn</span>
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-passive" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Passive Mode (Listen only, do not initiate connection actively)</span>
|
|
|
</label>
|
|
|
<label class="flex items-center gap-2 cursor-pointer">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-redist-slaac" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>slaac</span>
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-nexthop-self" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <span>Next-Hop Self (Rewrite next-hop to local router address)</span>
|
|
|
</label>
|
|
|
</div>
|
|
|
</div>
|
|
|
@@ -9559,230 +9377,89 @@
|
|
|
<hr class="border-slate-800/80 my-2">
|
|
|
|
|
|
<div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Default Originate</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-default-orig" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Announce Default Route (0.0.0.0/0)</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Network Blackhole</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-network-blackhole" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Drop unroutable traffic via blackhole</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">No Early Cut</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-no-early-cut" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Prevent early cut on prefix withdrawal</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Keep Sent Attributes</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-keep-sent-attrs" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Retain outbound advertised attributes</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Affinities</label>
|
|
|
+ <label class="text-slate-400 font-medium">Timers (Seconds)</label>
|
|
|
<div class="col-span-2 grid grid-cols-2 gap-3">
|
|
|
<div>
|
|
|
- <span class="text-[10px] text-slate-500 block mb-0.5">Input Affinity</span>
|
|
|
- <input type="text" id="modal-bgp-peer-input-affinity" placeholder="none" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
+ <span class="text-[10px] text-slate-500 block mb-0.5">Hold Time</span>
|
|
|
+ <input type="text" id="modal-bgp-peer-holdtime" placeholder="30 (or 00:00:30)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
</div>
|
|
|
<div>
|
|
|
- <span class="text-[10px] text-slate-500 block mb-0.5">Output Affinity</span>
|
|
|
- <input type="text" id="modal-bgp-peer-output-affinity" placeholder="none" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
+ <span class="text-[10px] text-slate-500 block mb-0.5">Keepalive Time</span>
|
|
|
+ <input type="text" id="modal-bgp-peer-keepalive" placeholder="10 (or 00:00:10)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1 text-white font-mono">
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <!-- TAB 3: ATTRIBUTES -->
|
|
|
- <div id="bgp-peer-tab-attributes" class="space-y-3.5 hidden">
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Nexthop Choice</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <select id="modal-bgp-peer-nexthop-choice" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <option value="force-self">force-self (Next-hop Self)</option>
|
|
|
- <option value="default">default</option>
|
|
|
- </select>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <!-- TAB 2: ROUTING & FILTERS -->
|
|
|
+ <div id="bgp-peer-tab-filters" class="space-y-4 hidden">
|
|
|
+ <datalist id="filter-chains-list"></datalist>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Default Prepend</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="number" id="modal-bgp-peer-default-prepend" min="0" max="16" placeholder="0 (none)" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Repeat local ASN in AS-PATH to make path less preferred</p>
|
|
|
+ <div class="p-3 bg-slate-950/40 border border-slate-800 rounded-xl space-y-3">
|
|
|
+ <div class="font-bold text-white text-xs">Route Policy Filters</div>
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">In Filter</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" list="filter-chains-list" id="modal-bgp-peer-in-filter" placeholder="e.g. Internal, awmn" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Routing filter chain applied to routes received from this peer</p>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Allow AS In</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="number" id="modal-bgp-peer-allow-as-in" min="0" max="10" placeholder="0" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <div class="grid grid-cols-3 items-center gap-3">
|
|
|
+ <label class="text-slate-400 font-medium">Out Filter</label>
|
|
|
+ <div class="col-span-2">
|
|
|
+ <input type="text" list="filter-chains-list" id="modal-bgp-peer-out-filter" placeholder="e.g. Internal, awmn" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <p class="text-[10px] text-slate-500 mt-0.5">Routing filter chain applied to routes exported to this peer</p>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Ignore AS Path Length</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-ignore-as-path-len" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Ignore AS Path Length in route selection</span>
|
|
|
+ <div class="p-3 bg-slate-950/40 border border-slate-800 rounded-xl space-y-3">
|
|
|
+ <div class="font-bold text-white text-xs">Route Redistribution into BGP</div>
|
|
|
+ <p class="text-[11px] text-slate-400">Select which router routing sources should be announced to this peer session:</p>
|
|
|
+ <div class="space-y-2.5 text-slate-300">
|
|
|
+ <label class="flex items-center gap-2.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-conn" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <div>
|
|
|
+ <span class="font-medium text-white">Redistribute Connected Subnets</span>
|
|
|
+ <p class="text-[10px] text-slate-500">Announces directly attached interface networks (RTS_DEVICE)</p>
|
|
|
+ </div>
|
|
|
</label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Remove Private AS</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-remove-priv-as" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Strip private AS numbers (64512-65534) from AS-PATH</span>
|
|
|
+ <label class="flex items-center gap-2.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-static" checked class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <div>
|
|
|
+ <span class="font-medium text-white">Redistribute Static Routes</span>
|
|
|
+ <p class="text-[10px] text-slate-500">Announces kernel static routes and blackhole discard routes (distance 255)</p>
|
|
|
+ </div>
|
|
|
</label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">AS Override</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-as-override" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Replace peer AS in AS-PATH</span>
|
|
|
+ <label class="flex items-center gap-2.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-redist-ospf" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <div>
|
|
|
+ <span class="font-medium text-white">Redistribute OSPF Routes</span>
|
|
|
+ <p class="text-[10px] text-slate-500">Announces routes learned from OSPF (RTS_OSPF)</p>
|
|
|
+ </div>
|
|
|
</label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Cisco VPLS NLRI</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-vpls-nlri" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Cisco VPLS NLRI Length Format</span>
|
|
|
+ <label class="flex items-center gap-2.5 cursor-pointer">
|
|
|
+ <input type="checkbox" id="modal-bgp-peer-default-orig" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
+ <div>
|
|
|
+ <span class="font-medium text-white">Default Originate (0.0.0.0/0)</span>
|
|
|
+ <p class="text-[10px] text-slate-500">Always generate and announce a default gateway route to this peer</p>
|
|
|
+ </div>
|
|
|
</label>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <!-- TAB 4: FILTER -->
|
|
|
- <div id="bgp-peer-tab-filter" class="space-y-3.5 hidden">
|
|
|
- <datalist id="filter-chains-list"></datalist>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Filter</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" list="filter-chains-list" id="modal-bgp-peer-in-filter" placeholder="e.g. awmn" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Routing Filter chain applied to incoming routes</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Accept NLRI</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-accept-nlri" placeholder="Optional NLRI prefixes" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Accept Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-accept-comm" placeholder="e.g. 65001:100" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Accept Ext Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-accept-ext-comm" placeholder="e.g. rt:65001:10" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Accept Large Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-accept-large-comm" placeholder="e.g. 65001:1:1" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Filter Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-filter-comm" placeholder="Filter pattern" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Filter Ext Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-filter-ext-comm" placeholder="Filter pattern" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
+ <!-- TAB 3: ADVERTISED NETWORKS -->
|
|
|
+ <div id="bgp-peer-tab-networks" class="space-y-4 hidden">
|
|
|
+ <div class="p-3 bg-purple-950/20 border border-purple-800/40 rounded-xl flex items-start gap-3">
|
|
|
+ <span class="text-purple-400 text-base">🛡️</span>
|
|
|
+ <div class="text-[11px] text-slate-300">
|
|
|
+ <div class="font-semibold text-purple-300 mb-0.5">Blackhole Discard (Distance 255) Protection</div>
|
|
|
+ Advertised networks listed here are announced directly to this peer. The router automatically installs a blackhole discard route with metric 255 in the Linux kernel routing table so your BGP daemon can reliably originate the prefix even if physical interfaces flap or subnets have unassigned addresses, eliminating packet bouncing and routing loops.
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Filter Large Communities</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-in-filter-large-comm" placeholder="Filter pattern" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Input Filter Unknown</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <label class="flex items-center gap-2 cursor-pointer text-slate-300">
|
|
|
- <input type="checkbox" id="modal-bgp-peer-in-filter-unknown" class="rounded text-cyan-500 bg-slate-800 border-slate-700">
|
|
|
- <span>Filter unknown BGP attributes</span>
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <hr class="border-slate-800/80 my-2">
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Output Filter</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" list="filter-chains-list" id="modal-bgp-peer-out-filter" placeholder="e.g. awmn" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <p class="text-[10px] text-slate-500 mt-0.5">Routing Filter chain applied to outgoing routes</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Output Selection Policy</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <select id="modal-bgp-peer-out-selection-policy" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- <option value="disabled">disabled</option>
|
|
|
- <option value="passive">passive</option>
|
|
|
- <option value="force">force</option>
|
|
|
- </select>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div class="grid grid-cols-3 items-center gap-3">
|
|
|
- <label class="text-slate-400 font-medium">Output Network</label>
|
|
|
- <div class="col-span-2">
|
|
|
- <input type="text" id="modal-bgp-peer-out-network-name" placeholder="e.g. BGP-AWMN" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-1.5 text-white font-mono">
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <hr class="border-slate-800/80 my-3">
|
|
|
-
|
|
|
- <!-- Output Networks section with [+] and [-] buttons as requested! -->
|
|
|
<div>
|
|
|
<div class="flex items-center justify-between mb-2">
|
|
|
<div>
|
|
|
@@ -9836,6 +9513,9 @@
|
|
|
</div>
|
|
|
<form id="bgp-network-form" onsubmit="submitBgpNetwork(event)" class="p-6 space-y-4 text-xs">
|
|
|
<input type="hidden" id="modal-bgp-net-id">
|
|
|
+ <div class="p-2.5 rounded-lg bg-purple-950/30 border border-purple-800/40 text-[11px] text-purple-300">
|
|
|
+ <span class="font-bold">🛡️ Discard Route:</span> Advertised prefixes automatically maintain a kernel blackhole route with metric 255 so BGP originates the prefix reliably without routing loops.
|
|
|
+ </div>
|
|
|
<div>
|
|
|
<label class="block font-semibold text-slate-300 mb-1.5">Network Prefix (CIDR) *</label>
|
|
|
<input type="text" id="modal-bgp-net-cidr" required placeholder="10.200.0.0/24" class="w-full bg-slate-800 border border-slate-700 rounded-lg px-3 py-2 text-white font-mono focus:outline-none focus:border-purple-500">
|