Deleted Added
full compact
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}