alias_db.c (26026) | alias_db.c (27864) |
---|---|
1/* -*- mode: c; tab-width: 8; c-basic-indent: 4; -*- 2 Alias_db.c encapsulates all data structures used for storing 3 packet aliasing data. Other parts of the aliasing software 4 access data through functions provided in this file. 5 6 Data storage is based on the notion of a "link", which is 7 established for ICMP echo/reply packets, UDP datagrams and 8 TCP stream connections. A link stores the original source --- 235 unchanged lines hidden (view full) --- 244 u_int start_point_in; 245 struct alias_link *next_out; /* Linked list pointers for input and */ 246 struct alias_link *last_out; /* output tables */ 247 struct alias_link *next_in; /* . */ 248 struct alias_link *last_in; /* . */ 249 250 union /* Auxiliary data */ 251 { | 1/* -*- mode: c; tab-width: 8; c-basic-indent: 4; -*- 2 Alias_db.c encapsulates all data structures used for storing 3 packet aliasing data. Other parts of the aliasing software 4 access data through functions provided in this file. 5 6 Data storage is based on the notion of a "link", which is 7 established for ICMP echo/reply packets, UDP datagrams and 8 TCP stream connections. A link stores the original source --- 235 unchanged lines hidden (view full) --- 244 u_int start_point_in; 245 struct alias_link *next_out; /* Linked list pointers for input and */ 246 struct alias_link *last_out; /* output tables */ 247 struct alias_link *next_in; /* . */ 248 struct alias_link *last_in; /* . */ 249 250 union /* Auxiliary data */ 251 { |
252 struct in_addr frag_addr; | |
253 char *frag_ptr; | 252 char *frag_ptr; |
253 struct in_addr frag_addr; |
|
254 struct tcp_dat *tcp; 255 } data; 256}; 257 258 259 260 261 --- 488 unchanged lines hidden (view full) --- 750 if (link->data.tcp != NULL) 751 free(link->data.tcp); 752 break; 753 case LINK_FRAGMENT_ID: 754 fragmentIdLinkCount--; 755 break; 756 case LINK_FRAGMENT_PTR: 757 fragmentPtrLinkCount--; | 254 struct tcp_dat *tcp; 255 } data; 256}; 257 258 259 260 261 --- 488 unchanged lines hidden (view full) --- 750 if (link->data.tcp != NULL) 751 free(link->data.tcp); 752 break; 753 case LINK_FRAGMENT_ID: 754 fragmentIdLinkCount--; 755 break; 756 case LINK_FRAGMENT_PTR: 757 fragmentPtrLinkCount--; |
758 if (link->data.frag_ptr != NULL) 759 free(link->data.frag_ptr); |
|
758 break; 759 } 760 761/* Free memory */ 762 free(link); 763 764/* Write statistics, if logging enabled */ 765 if (packetAliasMode & PKT_ALIAS_LOG) --- 580 unchanged lines hidden (view full) --- 1346 1347 SetFragmentData(), GetFragmentData() 1348 SetFragmentPtr(), GetFragmentPtr() 1349 SetStateIn(), SetStateOut(), GetStateIn(), GetStateOut() 1350 GetOriginalAddress(), GetDestAddress(), GetAliasAddress() 1351 GetOriginalPort(), GetAliasPort() 1352 SetAckModified(), GetAckModified() 1353 GetDeltaAckIn(), GetDeltaSeqOut(), AddSeq() | 760 break; 761 } 762 763/* Free memory */ 764 free(link); 765 766/* Write statistics, if logging enabled */ 767 if (packetAliasMode & PKT_ALIAS_LOG) --- 580 unchanged lines hidden (view full) --- 1348 1349 SetFragmentData(), GetFragmentData() 1350 SetFragmentPtr(), GetFragmentPtr() 1351 SetStateIn(), SetStateOut(), GetStateIn(), GetStateOut() 1352 GetOriginalAddress(), GetDestAddress(), GetAliasAddress() 1353 GetOriginalPort(), GetAliasPort() 1354 SetAckModified(), GetAckModified() 1355 GetDeltaAckIn(), GetDeltaSeqOut(), AddSeq() |
1354 ClearNewLink() 1355 CheckNewLink() | |
1356*/ 1357 1358 1359void 1360SetFragmentAddr(struct alias_link *link, struct in_addr src_addr) 1361{ 1362 link->data.frag_addr = src_addr; 1363} --- 88 unchanged lines hidden (view full) --- 1452 1453void 1454SetDefaultAliasAddress(struct in_addr alias_addr) 1455{ 1456 aliasAddress = alias_addr; 1457} 1458 1459 | 1356*/ 1357 1358 1359void 1360SetFragmentAddr(struct alias_link *link, struct in_addr src_addr) 1361{ 1362 link->data.frag_addr = src_addr; 1363} --- 88 unchanged lines hidden (view full) --- 1452 1453void 1454SetDefaultAliasAddress(struct in_addr alias_addr) 1455{ 1456 aliasAddress = alias_addr; 1457} 1458 1459 |
1460void 1461SetDefaultTargetAddress(struct in_addr target_addr) 1462{ 1463 targetAddress = target_addr; 1464} 1465 1466 1467void ClearDefaultTargetAddress(void) 1468{ 1469 targetAddress.s_addr = 0; 1470} 1471 1472 | |
1473u_short 1474GetOriginalPort(struct alias_link *link) 1475{ 1476 return(link->src_port); 1477} 1478 1479 1480u_short --- 175 unchanged lines hidden (view full) --- 1656 else 1657 { 1658 fprintf(stderr, "PacketAlias/SetExpire(): "); 1659 fprintf(stderr, "error in expire parameter\n"); 1660 } 1661} 1662 1663void | 1460u_short 1461GetOriginalPort(struct alias_link *link) 1462{ 1463 return(link->src_port); 1464} 1465 1466 1467u_short --- 175 unchanged lines hidden (view full) --- 1643 else 1644 { 1645 fprintf(stderr, "PacketAlias/SetExpire(): "); 1646 fprintf(stderr, "error in expire parameter\n"); 1647 } 1648} 1649 1650void |
1664ClearNewDefaultLink(void) | 1651ClearCheckNewLink(void) |
1665{ 1666 newDefaultLink = 0; 1667} 1668 1669 | 1652{ 1653 newDefaultLink = 0; 1654} 1655 1656 |
1670int 1671CheckNewDefaultLink(void) 1672{ 1673 return newDefaultLink; 1674} | 1657/* Miscellaneous Functions |
1675 | 1658 |
1659 HouseKeeping() 1660 InitPacketAliasLog() 1661 UninitPacketAliasLog() 1662*/ |
|
1676 | 1663 |
1677 | |
1678/* 1679 Whenever an outgoing or incoming packet is handled, HouseKeeping() 1680 is called to find and remove timed-out aliasing links. Logic exists 1681 to sweep through the entire table and linked list structure 1682 every 60 seconds. 1683 1684 (prototype in alias_local.h) 1685*/ --- 43 unchanged lines hidden (view full) --- 1729 fprintf(stderr, "PacketAlias/HouseKeeping(): "); 1730 fprintf(stderr, "something unexpected in time values\n"); 1731 lastCleanupTime = timeStamp; 1732 houseKeepingResidual = 0; 1733 } 1734} 1735 1736 | 1664/* 1665 Whenever an outgoing or incoming packet is handled, HouseKeeping() 1666 is called to find and remove timed-out aliasing links. Logic exists 1667 to sweep through the entire table and linked list structure 1668 every 60 seconds. 1669 1670 (prototype in alias_local.h) 1671*/ --- 43 unchanged lines hidden (view full) --- 1715 fprintf(stderr, "PacketAlias/HouseKeeping(): "); 1716 fprintf(stderr, "something unexpected in time values\n"); 1717 lastCleanupTime = timeStamp; 1718 houseKeepingResidual = 0; 1719 } 1720} 1721 1722 |
1723/* Init the log file and enable logging */ 1724void 1725InitPacketAliasLog(void) 1726{ 1727 if ((~packetAliasMode & PKT_ALIAS_LOG) 1728 && (monitorFile = fopen("/var/log/alias.log", "w"))) 1729 { 1730 packetAliasMode |= PKT_ALIAS_LOG; 1731 fprintf(monitorFile, 1732 "PacketAlias/InitPacketAliasLog: Packet alias logging enabled.\n"); 1733 } 1734} |
|
1737 1738 | 1735 1736 |
1737/* Close the log-file and disable logging. */ 1738void 1739UninitPacketAliasLog(void) 1740{ 1741 if( monitorFile ) 1742 fclose(monitorFile); 1743 packetAliasMode &= ~PKT_ALIAS_LOG; 1744} |
|
1739 | 1745 |
1746 1747 1748 1749 1750 |
|
1740/* Outside world interfaces 1741 1742-- "outside world" means other than alias*.c routines -- 1743 1744 PacketAliasRedirectPort() 1745 PacketAliasRedirectAddr() | 1751/* Outside world interfaces 1752 1753-- "outside world" means other than alias*.c routines -- 1754 1755 PacketAliasRedirectPort() 1756 PacketAliasRedirectAddr() |
1746 SetPacketAliasAddress() 1747 InitPacketAliasLog() 1748 UninitPacketAliasLog() 1749 InitPacketAlias() 1750 SetPacketAliasMode() | 1757 PacketAliasRedirectDelete() 1758 PacketAliasSetAddress() 1759 PacketAliasInit() 1760 PacketAliasSetMode() |
1751 1752(prototypes in alias.h) 1753*/ 1754 1755/* Redirection from a specific public addr:port to a 1756 a private addr:port */ 1757struct alias_link * 1758PacketAliasRedirectPort(struct in_addr src_addr, u_short src_port, --- 31 unchanged lines hidden (view full) --- 1790 fprintf(stderr, "PacketAliasRedirectPort(): " 1791 "call to AddLink() failed\n"); 1792 } 1793 1794 return link; 1795} 1796 1797 | 1761 1762(prototypes in alias.h) 1763*/ 1764 1765/* Redirection from a specific public addr:port to a 1766 a private addr:port */ 1767struct alias_link * 1768PacketAliasRedirectPort(struct in_addr src_addr, u_short src_port, --- 31 unchanged lines hidden (view full) --- 1800 fprintf(stderr, "PacketAliasRedirectPort(): " 1801 "call to AddLink() failed\n"); 1802 } 1803 1804 return link; 1805} 1806 1807 |
1798/* This function is slightly less generalized than 1799 PacketAliasRedirectPort and is included for backwards 1800 compatibility */ 1801int 1802PacketAliasPermanentLink(struct in_addr src_addr, u_short src_port, 1803 struct in_addr dst_addr, u_short dst_port, 1804 u_short alias_port, u_char proto) 1805{ 1806 struct alias_link *link; 1807 1808 link = PacketAliasRedirectPort(src_addr, src_port, 1809 dst_addr, dst_port, 1810 nullAddress, alias_port, 1811 proto); 1812 1813 if (link == NULL) 1814 return -1; 1815 else 1816 return 0; 1817} 1818 1819 | |
1820/* Static address translation */ 1821struct alias_link * 1822PacketAliasRedirectAddr(struct in_addr src_addr, 1823 struct in_addr alias_addr) 1824{ 1825 struct alias_link *link; 1826 1827 link = AddLink(src_addr, nullAddress, alias_addr, --- 12 unchanged lines hidden (view full) --- 1840 1841 return link; 1842} 1843 1844 1845void 1846PacketAliasRedirectDelete(struct alias_link *link) 1847{ | 1808/* Static address translation */ 1809struct alias_link * 1810PacketAliasRedirectAddr(struct in_addr src_addr, 1811 struct in_addr alias_addr) 1812{ 1813 struct alias_link *link; 1814 1815 link = AddLink(src_addr, nullAddress, alias_addr, --- 12 unchanged lines hidden (view full) --- 1828 1829 return link; 1830} 1831 1832 1833void 1834PacketAliasRedirectDelete(struct alias_link *link) 1835{ |
1848/* This is a very dangerous function to put in the API, | 1836/* This is a dangerous function to put in the API, |
1849 because an invalid pointer can crash the program. */ 1850 1851 deleteAllLinks = 1; 1852 DeleteLink(link); 1853 deleteAllLinks = 0; 1854} 1855 1856 1857void | 1837 because an invalid pointer can crash the program. */ 1838 1839 deleteAllLinks = 1; 1840 DeleteLink(link); 1841 deleteAllLinks = 0; 1842} 1843 1844 1845void |
1858SetPacketAliasAddress(struct in_addr addr) | 1846PacketAliasSetAddress(struct in_addr addr) |
1859{ | 1847{ |
1860 if (aliasAddress.s_addr != addr.s_addr) | 1848 if (packetAliasMode & PKT_ALIAS_RESET_ON_ADDR_CHANGE 1849 && aliasAddress.s_addr != addr.s_addr) |
1861 { 1862 CleanupAliasData(); 1863 aliasAddress = addr; 1864 } 1865} 1866 1867 | 1850 { 1851 CleanupAliasData(); 1852 aliasAddress = addr; 1853 } 1854} 1855 1856 |
1868/* Init the log file and enable logging */ | |
1869void | 1857void |
1870InitPacketAliasLog(void) | 1858PacketAliasSetTarget(struct in_addr target_addr) |
1871{ | 1859{ |
1872 if ((~packetAliasMode & PKT_ALIAS_LOG) 1873 && (monitorFile = fopen("/var/log/alias.log", "w"))) 1874 { 1875 packetAliasMode |= PKT_ALIAS_LOG; 1876 fprintf(monitorFile, 1877 "PacketAlias/InitPacketAliasLog: Packet alias logging enabled.\n"); 1878 } | 1860 targetAddress = target_addr; |
1879} 1880 1881 | 1861} 1862 1863 |
1882/* Close the log-file and disable logging. */ | |
1883void | 1864void |
1884UninitPacketAliasLog(void) | 1865PacketAliasInit(void) |
1885{ | 1866{ |
1886 if( monitorFile ) 1887 fclose(monitorFile); 1888 packetAliasMode &= ~PKT_ALIAS_LOG; 1889} 1890 1891 1892void 1893InitPacketAlias(void) 1894{ | |
1895 int i; 1896 struct timeval tv; 1897 struct timezone tz; 1898 1899 if (firstCall == 1) 1900 { 1901 gettimeofday(&tv, &tz); 1902 timeStamp = tv.tv_sec; --- 10 unchanged lines hidden (view full) --- 1913 else 1914 { 1915 deleteAllLinks = 1; 1916 CleanupAliasData(); 1917 deleteAllLinks = 0; 1918 } 1919 1920 aliasAddress.s_addr = 0; | 1867 int i; 1868 struct timeval tv; 1869 struct timezone tz; 1870 1871 if (firstCall == 1) 1872 { 1873 gettimeofday(&tv, &tz); 1874 timeStamp = tv.tv_sec; --- 10 unchanged lines hidden (view full) --- 1885 else 1886 { 1887 deleteAllLinks = 1; 1888 CleanupAliasData(); 1889 deleteAllLinks = 0; 1890 } 1891 1892 aliasAddress.s_addr = 0; |
1893 targetAddress.s_addr = 0; |
|
1921 1922 icmpLinkCount = 0; 1923 udpLinkCount = 0; 1924 tcpLinkCount = 0; 1925 fragmentIdLinkCount = 0; 1926 fragmentPtrLinkCount = 0; 1927 sockCount = 0; 1928 1929 cleanupIndex =0; 1930 1931 packetAliasMode = PKT_ALIAS_SAME_PORTS | 1894 1895 icmpLinkCount = 0; 1896 udpLinkCount = 0; 1897 tcpLinkCount = 0; 1898 fragmentIdLinkCount = 0; 1899 fragmentPtrLinkCount = 0; 1900 sockCount = 0; 1901 1902 cleanupIndex =0; 1903 1904 packetAliasMode = PKT_ALIAS_SAME_PORTS |
1932 | PKT_ALIAS_USE_SOCKETS; 1933 1934 if (packetAliasMode & PKT_ALIAS_LOG) 1935 { 1936 InitPacketAliasLog(); 1937 fprintf(monitorFile, "Packet aliasing initialized.\n"); 1938 } | 1905 | PKT_ALIAS_USE_SOCKETS 1906 | PKT_ALIAS_RESET_ON_ADDR_CHANGE; |
1939} 1940 1941 1942/* Change mode for some operations */ 1943unsigned int | 1907} 1908 1909 1910/* Change mode for some operations */ 1911unsigned int |
1944SetPacketAliasMode | 1912PacketAliasSetMode |
1945( 1946 unsigned int flags, /* Which state to bring flags to */ 1947 unsigned int mask /* Mask of which flags to affect (use 0 to do a 1948 probe for flag values) */ 1949) 1950{ 1951/* Enable logging? */ 1952 if (flags & mask & PKT_ALIAS_LOG) --- 6 unchanged lines hidden (view full) --- 1959 } 1960 1961/* Other flags can be set/cleared without special action */ 1962 packetAliasMode = (flags & mask) | (packetAliasMode & ~mask); 1963 return packetAliasMode; 1964} 1965 1966 | 1913( 1914 unsigned int flags, /* Which state to bring flags to */ 1915 unsigned int mask /* Mask of which flags to affect (use 0 to do a 1916 probe for flag values) */ 1917) 1918{ 1919/* Enable logging? */ 1920 if (flags & mask & PKT_ALIAS_LOG) --- 6 unchanged lines hidden (view full) --- 1927 } 1928 1929/* Other flags can be set/cleared without special action */ 1930 packetAliasMode = (flags & mask) | (packetAliasMode & ~mask); 1931 return packetAliasMode; 1932} 1933 1934 |
1967/* 1968 Clear all packet aliasing links, but leave mode 1969 flags unchanged. Typically used when the interface 1970 address changes and all existing links become 1971 invalid. 1972*/ | 1935int 1936PacketAliasCheckNewLink(void) 1937{ 1938 return newDefaultLink; 1939} |