In contrast to live hardware testbeds, which are evaluated largely on performance, network simulators are primarily used to test and validate new protocols and algorithms. As such, a network simulator should be designed to be modular, extensible, re-usable, and robust. This work examines the design of TCP congestion control in the ns-3 network simulator and presents a new design, not specific to ns-3, that will be more modular and extensible. We also demonstrate that the implementation in the current ns-3 release (version 3.25) is not able to duplicate results presented in previous literature. These findings, along with the improved design, are the main contributions of this paper. To validate our design, we show how its modular approach can be used to implement existing TCP congestion control variants, e.g., TCP New Reno and TCP Westwood, as well as new ones, e.g., TCP Inigo.