@@ -4,6 +4,7 @@ package preferences
44
55import (
66 "net"
7+ "strconv"
78 "strings"
89
910 "github.com/fosrl/newt/logger"
@@ -21,11 +22,17 @@ type PreferencesTab struct {
2122 dnsTunnelCheckBox * walk.CheckBox
2223 primaryDNSEdit * walk.LineEdit
2324 secondaryDNSEdit * walk.LineEdit
25+ mtuEdit * walk.LineEdit
2426 saveButton * walk.PushButton
2527 configManager * config.ConfigManager
2628 window * PreferencesWindow
2729}
2830
31+ const (
32+ minMTU = 576
33+ maxMTU = 9000
34+ )
35+
2936// NewPreferencesTab creates a new preferences tab
3037func NewPreferencesTab (cm * config.ConfigManager ) * PreferencesTab {
3138 return & PreferencesTab {
@@ -220,6 +227,49 @@ func (pt *PreferencesTab) Create(parent *walk.TabWidget) (*walk.TabPage, error)
220227 // Spacer
221228 walk .NewHSpacer (secondaryDNSContainer )
222229
230+ // Advanced section title
231+ advancedSectionTitle , err := walk .NewLabel (pt .contentContainer )
232+ if err != nil {
233+ return nil , err
234+ }
235+ advancedSectionTitle .SetText ("Advanced" )
236+ if font != nil {
237+ advancedSectionTitle .SetFont (font )
238+ }
239+
240+ // MTU section
241+ mtuContainer , err := walk .NewComposite (pt .contentContainer )
242+ if err != nil {
243+ return nil , err
244+ }
245+ mtuLayout := walk .NewHBoxLayout ()
246+ mtuLayout .SetMargins (walk.Margins {})
247+ mtuLayout .SetSpacing (12 )
248+ mtuContainer .SetLayout (mtuLayout )
249+
250+ mtuLabel , err := walk .NewLabel (mtuContainer )
251+ if err != nil {
252+ return nil , err
253+ }
254+ mtuLabel .SetText ("MTU" )
255+ mtuLabel .SetMinMaxSize (walk.Size {Width : 200 , Height : 0 }, walk.Size {Width : 200 , Height : 0 })
256+
257+ if pt .mtuEdit , err = walk .NewLineEdit (mtuContainer ); err != nil {
258+ return nil , err
259+ }
260+ pt .mtuEdit .SetText (strconv .Itoa (pt .configManager .GetMTU ()))
261+
262+ // Spacer
263+ walk .NewHSpacer (mtuContainer )
264+
265+ mtuDescLabel , err := walk .NewLabel (pt .contentContainer )
266+ if err != nil {
267+ return nil , err
268+ }
269+ mtuDescLabel .SetText ("Your sites must be configured to use the same MTU value." )
270+ mtuDescLabel .SetTextColor (walk .RGB (100 , 100 , 100 ))
271+ mtuDescLabel .SetMinMaxSize (walk.Size {}, walk.Size {Width : 400 , Height : 0 })
272+
223273 // Add spacer to fill remaining space
224274 walk .NewVSpacer (pt .contentContainer )
225275
@@ -282,6 +332,26 @@ func (pt *PreferencesTab) onSave() {
282332 dnsTunnel := pt .dnsTunnelCheckBox .Checked ()
283333 primaryDNS := strings .TrimSpace (pt .primaryDNSEdit .Text ())
284334 secondaryDNS := strings .TrimSpace (pt .secondaryDNSEdit .Text ())
335+ mtuText := strings .TrimSpace (pt .mtuEdit .Text ())
336+ mtu , err := strconv .Atoi (mtuText )
337+ if mtuText == "" || err != nil || mtu < minMTU || mtu > maxMTU {
338+ // Restore to current config value
339+ currentValue := strconv .Itoa (pt .configManager .GetMTU ())
340+ pt .mtuEdit .SetText (currentValue )
341+ var owner walk.Form
342+ if pt .window != nil {
343+ owner = pt .window
344+ }
345+ td := walk .NewTaskDialog ()
346+ _ , _ = td .Show (walk.TaskDialogOpts {
347+ Owner : owner ,
348+ Title : "Invalid Input" ,
349+ Content : "MTU must be a whole number between 576 and 9000." ,
350+ IconSystem : walk .TaskDialogSystemIconWarning ,
351+ CommonButtons : win .TDCBF_OK_BUTTON ,
352+ })
353+ return
354+ }
285355
286356 // Validate primary DNS (required)
287357 if primaryDNS == "" {
@@ -356,9 +426,11 @@ func (pt *PreferencesTab) onSave() {
356426 dnsOverrideVal := dnsOverride
357427 dnsTunnelVal := dnsTunnel
358428 primaryDNSVal := primaryDNS
429+ mtuVal := mtu
359430 cfg .DNSOverride = & dnsOverrideVal
360431 cfg .DNSTunnel = & dnsTunnelVal
361432 cfg .PrimaryDNS = & primaryDNSVal
433+ cfg .MTU = & mtuVal
362434 if secondaryDNS != "" {
363435 cfg .SecondaryDNS = & secondaryDNS
364436 } else {
0 commit comments