{"id":3305,"date":"2022-01-19T02:08:58","date_gmt":"2022-01-19T10:08:58","guid":{"rendered":"https:\/\/wonghoi.humgar.com\/blog\/?p=3305"},"modified":"2025-11-30T23:58:45","modified_gmt":"2025-12-01T07:58:45","slug":"dd-wrt-web-admin-ui-wtf-inconspicuous-invalid-config-combinations-crashes-your-router-out-of-the-box","status":"publish","type":"post","link":"https:\/\/wonghoi.humgar.com\/blog\/2022\/01\/19\/dd-wrt-web-admin-ui-wtf-inconspicuous-invalid-config-combinations-crashes-your-router-out-of-the-box\/","title":{"rendered":"dd-wrt web admin UI WTF!? Inconspicuous invalid config combinations crashes your router out of the box."},"content":{"rendered":"\n<p>I was puzzled by why my dd-wrt router behave erratically each time I change the &#8220;Start IP Address&#8221; in DHCP leases to an upper range and I just figured out why. <\/p>\n\n\n\n<p>I hate the user interface of dd-wrt with a passion, but it&#8217;s the only open source firmware for one of my routers that signed Broadcom&#8217;s close source NDA to get its driver SDK so I&#8217;m stuck with it:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ugly as fuck<\/h2>\n\n\n\n<p>In the bad old days people think it&#8217;s a good idea to make 4 little edit boxes for IP addresses than checking if the input conforms to the IP address format with dots. But it cannot detect &#8216;.&#8217; keypress and jump to the next box (use Tab instead). e.g.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"519\" height=\"46\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-2.png\" alt=\"\" class=\"wp-image-3309\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-2.png 519w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-2-300x27.png 300w\" sizes=\"auto, (max-width: 519px) 100vw, 519px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Inconsistent state possible<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"633\" height=\"389\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-5.png\" alt=\"\" class=\"wp-image-3312\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-5.png 633w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-5-300x184.png 300w\" sizes=\"auto, (max-width: 633px) 100vw, 633px\" \/><figcaption class=\"wp-element-caption\">Start IP address, which is dependent on Local IP Address, is not updated\/reflected until you press &#8220;Save&#8221;. This means every time you make a change, you need to hit &#8220;Save&#8221; immediately so other dependent settings will make sense before you start editing them.<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Features are arranged\/grouped like config files <\/h2>\n\n\n\n<p>This is bare minimum effort on UI dev, which is not much better than going to linux prompt and edit the config files. <\/p>\n\n\n\n<p>With config files, at least we&#8217;d be more careful and try to understand what each key-value pair mean and their relationship map. This lousy web admin UI interface gives a false impression that non-developers knows what they are doing, so it turns into a puzzle that we&#8217;ll have to google the answer for every fucking basic application. <\/p>\n\n\n\n<p>Using the web UI instead of editing the config files feels like programming in assembly as an improvement over programming in raw machine code. It&#8217;s begrudgingly painful.<\/p>\n\n\n\n<p>One example is the grouping for wireless radio. For most considerate web admin interface, the SSID are grouped logically with your WiFi password, but in dd-wrt, you set SSID in &#8220;Basic Settings&#8221; and the WiFi password under &#8220;Wirelesss Security&#8221;.  Make sense for the programmer to decouple the radio from the access control (group by features), but it&#8217;s not application\/use case oriented (group by radio interface), thus it frustrates users.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Non-intuitive (less common) presentation<\/h2>\n\n\n\n<p>As described above, out of developer&#8217;s convenience, dd-wrt&#8217;s web admin UI just do everything that makes beginners&#8217; life miserable or just throw them off. e.g. Windows users are used to specifying the subnet mask in quad-dotted notation like 255.255.255.0, not the CIDR notation like \/24:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"596\" height=\"111\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-3.png\" alt=\"\" class=\"wp-image-3310\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-3.png 596w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-3-300x56.png 300w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Confusing names<\/h2>\n\n\n\n<p>The names are often too terse that creates confusion with similar named features in a lot of places.<br>e.g. &#8220;Wireless GUI Access&#8221; does not mean the welcome page for your Guest network, but whether the wireless client have access to the Router <strong>Administration<\/strong>&#8216;s Web UI! <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"471\" height=\"41\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-4.png\" alt=\"\" class=\"wp-image-3311\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-4.png 471w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-4-300x26.png 300w\" sizes=\"auto, (max-width: 471px) 100vw, 471px\" \/><\/figure>\n<\/div>\n\n\n<p>It&#8217;s probably a few minutes of extra thought to call it &#8220;Allow admin web UI: Yes\/No&#8221;<\/p>\n\n\n\n<p>Another example is AP Isolation, which is under Advanced settings tab for each radio:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"648\" height=\"59\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-6.png\" alt=\"\" class=\"wp-image-3317\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-6.png 648w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-6-300x27.png 300w\" sizes=\"auto, (max-width: 648px) 100vw, 648px\" \/><\/figure>\n<\/div>\n\n\n<p>Is this isolating APs in a mesh or isolating clients connected to the AP from each other? Turns out it&#8217;s the latter! Just say &#8220;(For this AP), allow connected wireless clients to talk to each other on the same network: Yes\/No&#8221;. I think it&#8217;s a common use scenario that the regular users should be aware of and shouldn&#8217;t be stowed away with obscure radio\/PHY-level tweaks (settings aimed for hackers).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Overloaded names <\/h2>\n\n\n\n<p>The admin web UI is littered with overloaded names\/terms which means something completely different depending on context (like the settings 2 lines above). For example:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/wiki.dd-wrt.com\/wiki\/images\/thumb\/5\/53\/Access_point.jpg\/800px-Access_point.jpg\" alt=\"Image:Access point.jpg\"\/><figcaption class=\"wp-element-caption\">Access Point (AP) mode<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"368\" height=\"193\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image.png\" alt=\"\" class=\"wp-image-3306\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image.png 368w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-300x157.png 300w\" sizes=\"auto, (max-width: 368px) 100vw, 368px\" \/><figcaption class=\"wp-element-caption\">The SSID here is the SSID of the Access Point <br>(Wifi host. AP station accepting wirelesss clients)<\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter\"><img decoding=\"async\" src=\"https:\/\/wiki.dd-wrt.com\/wiki\/images\/thumb\/7\/7d\/Client_Bridge.jpg\/660px-Client_Bridge.jpg\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Client\/Repeater[Bridge] Mode <br>(all involves the dd-wrt router connecting to certain AP station\/SSID)<br><\/figcaption><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"443\" height=\"244\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-1.png\" alt=\"\" class=\"wp-image-3307\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-1.png 443w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-1-300x165.png 300w\" sizes=\"auto, (max-width: 443px) 100vw, 443px\" \/><figcaption class=\"wp-element-caption\">The SSID here is the SSID where the Client\/Repeater-Bridge\/Client-Bridge is attempting to connect to that contains the uplink\/WAN!<\/figcaption><\/figure>\n<\/div>\n\n\n<p>WTF?! The dialog box looks exactly the same despite the wifi section is acting like a completely different device! What the fuck is &#8220;Network Configuration: Unbridged&#8221; for a Client Bridge?! HELP!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Unchecked invalid combinations that crashes!<\/h2>\n\n\n\n<p>This is the most frustrating behavior and should be considered a bug. I wasted days resetting my router over and over and it keeps hanging randomly after I change the DHCP server&#8217;s starting IP address. This is the default out of the box settings:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"149\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-9.png\" alt=\"\" class=\"wp-image-3373\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-9.png 620w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-9-300x72.png 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><figcaption class=\"wp-element-caption\">Default DHCP settings. End IP Address is 192.168.1.253<\/figcaption><\/figure>\n<\/div>\n\n\n<p>End IP Address = Start IP Address + Maximum DHCP Users &#8211; 1. They probably chose this number to reserve 192.168.1.254 for static IP (like some admin page of other devices). 255 is broadcast IP so of course it shouldn&#8217;t be assigned<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Moving the the &#8220;Start IP Address&#8221; <strong>up <\/strong>without adjusting &#8220;Maximum DHCP Users&#8221; accordingly will make your router behave erratically because the DHCP will try to lease IP out of range! <\/p>\n\n\n\n<p><\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"143\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-11.png\" alt=\"\" class=\"wp-image-3375\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-11.png 632w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-11-300x68.png 300w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><figcaption class=\"wp-element-caption\">This will corrupt your router&#8217;s memory!<\/figcaption><\/figure>\n<\/div>\n\n\n<p>The End IP Address is displayed on Status -&gt; LAN -&gt;  Dynamic Host Configuration Protocol -&gt; DHCP Status. And here&#8217;s the WTF moment:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"525\" height=\"233\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-12.png\" alt=\"\" class=\"wp-image-3376\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-12.png 525w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-12-300x133.png 300w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><figcaption class=\"wp-element-caption\">The End IP Address is now in a different subnet from the Start IP Address!<br>I&#8217;m using \/24 so 192.168.1.X is different from 192.168.2.X.<\/figcaption><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"106\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-14-1024x106.png\" alt=\"\" class=\"wp-image-3392\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-14-1024x106.png 1024w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-14-300x31.png 300w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-14-768x79.png 768w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-14.png 1319w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">From the web page, the attribute name is &#8220;dhcp_num&#8221;<\/figcaption><\/figure>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"474\" height=\"38\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-15.png\" alt=\"\" class=\"wp-image-3394\" style=\"width:474px;height:38px\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-15.png 474w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-15-300x24.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"918\" height=\"64\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-16.png\" alt=\"\" class=\"wp-image-3395\" srcset=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-16.png 918w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-16-300x21.png 300w, https:\/\/wonghoi.humgar.com\/blog\/wp-content\/uploads\/2022\/01\/image-16-768x54.png 768w\" sizes=\"auto, (max-width: 918px) 100vw, 918px\" \/><figcaption class=\"wp-element-caption\">This is the code that shows the derived &#8216;End IP Address&#8221; shown above<\/figcaption><\/figure>\n\n\n\n<p>I don&#8217;t know how it is coded, but if this number is computed in a low level way, chances are it&#8217;ll write garbage to the memory (for example if the number is used as an array index). I think normally it&#8217;d be checked in any not-so-shitty user interface so the invalid state\/condition won&#8217;t propagate down the code and hang the router. But in my case it did. If I just reboot the router without resetting to the defaults, it&#8217;d just hang again after a few interactions (like moving between a few pages or applying a setting).<\/p>\n\n\n\n<p>In any case, this check must be done at user level as even if the low level code say, quietly sets a valid default value when an invalid range was &#8216;entered&#8217;, it&#8217;d only surprise the user and make it even harder to troubleshoot. This UI bug is even less excusable as it&#8217;s more natural to have users enter the (Start, End) instead of (Start, # of slots). Probably takes half an hour more in coding to layout the UI code to enter ranges (add 4 boxes for quad-dotted notation for End IP and check them instead of just 1 box for # of DHCP leases), but making the user to do mental gymnastics and punish them by if they did it wrong is just outright terrible.<\/p>\n\n\n\n<p>FreshTomato has quite a bit of learning curve, but at least it try to do something that&#8217;s sensible for users for common scenarios instead of sticking strictly to how the code\/config files are written at developer&#8217;s level.<\/p>\n\n\n\n<p>DD-WRT is powerful but the UI suck big time, not because the features overwhelm less tech savvy users, but it&#8217;s purely unnecessary torture and pain even you know why it&#8217;s done that way. It&#8217;s web UI is as helpful as editing the text config file raw.<\/p>\n<div class=\"pvc_clear\"><\/div><p id=\"pvc_stats_3305\" class=\"pvc_stats all  \" data-element-id=\"3305\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p><div class=\"pvc_clear\"><\/div>","protected":false},"excerpt":{"rendered":"<p>I was puzzled by why my dd-wrt router behave erratically each time I change the &#8220;Start IP Address&#8221; in DHCP leases to an upper range and I just figured out why. I hate the user interface of dd-wrt with a &hellip; <a href=\"https:\/\/wonghoi.humgar.com\/blog\/2022\/01\/19\/dd-wrt-web-admin-ui-wtf-inconspicuous-invalid-config-combinations-crashes-your-router-out-of-the-box\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n<div class=\"pvc_clear\"><\/div>\n<p id=\"pvc_stats_3305\" class=\"pvc_stats all  \" data-element-id=\"3305\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> <img loading=\"lazy\" decoding=\"async\" width=\"16\" height=\"16\" alt=\"Loading\" src=\"https:\/\/wonghoi.humgar.com\/blog\/wp-content\/plugins\/page-views-count\/ajax-loader-2x.gif\" border=0 \/><\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[68,44],"tags":[],"class_list":["post-3305","post","type-post","status-publish","format-standard","hentry","category-dd-wrt","category-hardware"],"_links":{"self":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/3305","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/comments?post=3305"}],"version-history":[{"count":24,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/3305\/revisions"}],"predecessor-version":[{"id":6665,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/posts\/3305\/revisions\/6665"}],"wp:attachment":[{"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/media?parent=3305"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/categories?post=3305"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wonghoi.humgar.com\/blog\/wp-json\/wp\/v2\/tags?post=3305"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}